whitney-museum-mcp-server
whitney-mcp-ts
Whitney Museumの公開API用のMCPサーバーです。Claude Desktopや任意のMCPクライアントから、コレクション、アーティスト、展覧会、イベント、オーディオガイドを検索できます。
TypeScript製、stdioのみ対応。APIのRansack構文にフレンドリーなパラメータをマッピングし、帰属情報を添付し、モデルのコンテキストで扱いやすいようにレスポンスを切り詰めます。
WhitneyのAPIはオープンで認証不要です。APIキーは不要です。
インストール
npx whitney-mcp-tsまたはソースから:
git clone https://github.com/mildlydiverting/whitney-mcp-ts.git
cd whitney-mcp-ts
npm install
npm run buildNode 20以降が必要です。
Related MCP server: Wikipedia MCP Server
Claude Desktop
claude_desktop_config.json に追加:
{
"mcpServers": {
"whitney": {
"command": "npx",
"args": ["-y", "whitney-mcp-ts"]
}
}
}ソースから使う場合は、ビルドを指定します:
{
"mcpServers": {
"whitney": {
"command": "node",
"args": ["/absolute/path/to/whitney-mcp-ts/dist/index.js"]
}
}
}Claude Desktopを終了して再起動してください。設定では ~ は展開されないので、フルパスを使用してください。
ツール
ツール | 機能 |
| タイトル、アーティスト、分類、技法、日付、展示中かどうかで27,000点以上の作品を検索 |
| 1作品の完全なレコード — 寸法、クレジットライン、説明、画像URL |
| 7,000人以上のアーティストを検索。コレクション、ビエンナーレ、展示中で絞り込み |
| アーティストの完全なレコード。経歴、Getty ULAN、Wikidata IDを含む |
| 指定したアーティストの作品 |
| 指定したアーティストが参加した展覧会 |
| 1931年以降の展覧会を日付フィルタ付きで検索 |
| 1件の展覧会レコード |
| 2008年以降のトーク、ツアー、プログラムを検索 |
| 2009年以降に公開されたオーディオガイドを検索 |
| 任意のエンドポイント。生のRansack述語を使用 |
期待できること
検索結果は簡潔なレコードです。
Whitneyのレコードには長いHTMLの説明や経歴が含まれるため、検索では基本情報を返し、whitney_get_* で完全な情報を返します。散文は2,000文字、レスポンス全体は25,000文字で切り詰められます。
ページネーションは1ページ30件です。
これはAPIのページサイズです。page でページを選び、limit でさらに絞り込みます。デフォルトの10件は、広い検索でコンテキストが溢れるのを防ぎます。
検索構文はRansackです
述語は q の下にネストします(_eq、_cont、_cont_all_split、_gteq など)。並べ替えは q[s] の下です。型付きツールはフレンドリーな引数をこれらにマッピングします。whitney_query は、型付きツールが届かないもののために生の述語を公開します。
アーティストと作品のフィールドは明示的にマッピングされています。
展覧会、イベント、ガイド、ページは代わりに汎用サマライザーを通します。HTMLを除去し、タイムスタンプを日付に短縮し、相対URLを絶対URLにし、内部外部キーを削除します。美術館はフィールドセットが変更される可能性があると述べているため、必要でないものはハードコードされていません。limit: 1 で検索して実際のフィールド名を確認し、特定のものには filters を使用してください。
帰属情報
すべてのレスポンスは、美術館の名前と利用規約へのリンクを含むソース行で終わります。詳細レコードには2つの帰属フィールドもあります。
rights— 著作権表示。Whitney自身の説明テキストから抽出citation— 既製のMarkdown行。例:
Edward Hopper, Early Sunday Morning, 1930. Whitney Museum of American Art, © Heirs of Josephine N. Hopper/Licensed by Artists Rights Society (ARS), New York.
権利者は通常アーティストではないことに注意してください。10作品のサンプルでは、9作品が異なっていました。遺産管理団体、財団、ARSやVAGAなどの権利団体です。したがって、rights は推測せずに読む価値があります。これはWhitneyの利用規約が保持を求める表示です。
著作権表示のない作品(主に古い資料)は、美術館リンクの後で終わる引用になります。
一括データ
大規模なものには、APIをページングしないでください。Whitneyはアーティストと作品のCSVを https://github.com/whitneymuseum/open-access で公開しており、CC0でリリースされています。
既知のAPIの癖
sort: "random"は確実にランダム化されません。3件のランダムな作品を要求すると、同じアーティストの連続した3つの受入番号が返されました。本当にランダムが必要な場合は、代わりにランダムなページ番号を要求してください。作品の
display_dateは自由テキストです(例: "1915–1931, printed 1976–1977")。そのため、日付範囲はそこで機能しません。展覧会とイベントには実際のタイムスタンプがあり、starts_on_or_after/starts_on_or_beforeでフィルタリングできます。存命のアーティストは
death_year: "0"を持ちます。これで算術演算をしないでください。Ransackは認識できない述語をエラーにせず無視するため、フィールド名のスペルミスは静かにすべてを返します。結果の件数を確認してください。
セキュリティ
WhitneyのAPIはキーを必要としないため、認証情報はなく、漏洩するものも設定するものもありません。
すべてのツールは読み取り専用です。サーバーは whitney.org へのGETリクエストのみを行い、他には何もしません。ファイルシステムアクセス、シェル、書き込みはありません。エンドポイント名は固定リストから取得され、レコードIDはURLエンコードされ、フィルタパラメータは URLSearchParams を通ります。
既知の制限が1つあります。HTMLからMarkdownへの変換はネストされた量指定子を持つ正規表現を使用するため、意図的に不正な入力でバックトラッキングが悪化する可能性があります。入力はユーザーではなくWhitney自身のCMSから来るため、これが発生した場合、NYCで何かが非常にうまくいっていないことであり、おそらく私の責任ではありません。
何か見つけたら、issueを開いてください。
開発
npm test # unit tests, offline
npm run test:canary # live checks against the Whitney API
npm run inspect # MCP Inspector against the built serverカナリアスイートはCIで毎月実行されます。これはWhitneyがフィールド名を変更するのを検出するためのものです。ユニットテストは保存されたフィクスチャに対して実行されるため、その失敗モードは見えません。
ライセンス
コード: MIT License。
WhitneyはAPIを次の注記とともに提供しています:
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.
公開するものを作る前に、https://whitney.org/about/website/api で利用規約を読んでください。
上記のCSVデータセットはCC0であり、APIの利用規約よりも寛容な場合があることに注意してください。
Whitney Museum of American Artとは提携していません。これは彼らの公開APIのサードパーティラッパーであり、https://whitney.org/about/website/api に文書化されています。
謝辞
Sam Parsonsの whitney-museum-mcp も参照してください。同じAPIに対するPython/FastMCPサーバーで、DockerとHTTPトランスポートを備えています。
Whitneyのデジタルチームに、APIを公開し、適切に文書化してくれたことに感謝します。また、claude codeを使っていると明示的に書いてある素敵なブログ記事を書いてくれたことにも感謝します。それがあるおかげで、この全体をvibe codingした罪悪感が軽減されるからです。
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 gradedqualityCmaintenanceEnables searching and retrieving details from the Harvard Art Museums collection.497 npm2MIT
- AlicenseNot gradedqualityCmaintenanceEnables searching the Metropolitan Museum of Art collection by subject, artist, or keyword, retrieving detailed artwork information, and listing curatorial departments via natural language.145 npm3MIT