art-institute-chicago-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., "@art-institute-chicago-mcp-serverfind public-domain paintings by Monet on view at the Art Institute"
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.
Overview
The Art Institute of Chicago's collection through the museum's public API: about 133,000 artworks, plus artists, exhibitions, and audio-guide stops. Search artworks with text, structured filters, and facet counts; read full records with provenance, exhibition history, and rights-aware IIIF image URLs; resolve artists to ids; find exhibitions by topic or date; and search audio-guide transcripts. Runs as a stdio process or a local Streamable HTTP server, with no API key.
Tools
Tool | Description |
| Search artworks by text and filters (artist, department, type, style, subject, classification, place, gallery, years, public domain, on view, has image), with facet counts and date sorting |
| Fetch full records for up to 10 artworks: description, provenance, exhibition and publication history, image URLs with rights status, related media |
| Find artists, cultures, and organizations by name or id, with life dates, artwork counts, and sample works |
| Search past, current, and upcoming exhibitions by text and date, with the artworks shown when the museum lists them |
| Search the museum's audio-guide stops by text: stop title, MP3 URL, and transcript |
| List the values a search filter accepts (departments, types, styles, subjects, places, galleries, and more) with artwork counts |
Resources
Resource | Description |
| One artwork record as JSON, with the API license text and description attribution |
The same record is available from artic_get_artworks for clients that don't surface resources.
Related MCP server: artic-mcp
Capability reference
artic_search_artworks tool
query(every word must match;"exact phrase",-exclude, anda | bwork) plus filtersartist,artist_id,department,artwork_type,style,subject,classification,place_of_origin,gallery,year_from/year_to(date-span overlap, negative for BCE),public_domain_only,on_view_only, andhas_image, combined with ANDUp to 12 rows per page (default 10), so a page of long catalog records stays within common tool-output limits, within the first 1,000 matches;
sortisrelevance,date_asc, ordate_desc, andsort_appliedreportspopularitywhen relevance had no query textfacetsadds the top 15 values for up to seven fields (artistrows carryartist_id);limit: 0returns counts only
artic_get_artworks tool
1–10
idsper call (artwork page URLs are read as their id);sectionspicks the heavy text:descriptionandprovenanceby default, plusexhibition_history,publication_history, andcatalogueRecords return in request order, with
missing_idsfor ids the museum doesn't have anddeferred_idsfor records past a 100,000-byte response budgetinclude_related_media(default on) loads up to 20 linked lectures and audio stops per call;description_attributionappears whenever CC BY description text is returned
artic_search_artists tool
query(all name words must match) or up to 25ids, not both; query mode addsartists_only(defaulttrue),born_from/born_to, and up to 25 agents per pageEach agent carries
artwork_count, up to threesample_works(the museum's highlights first), life years, andalt_names; ids mode reportsmissing_ids
artic_search_exhibitions tool
query,when(current,upcoming,past, or the defaultany), anddate_from/date_to(YYYY-MM-DD, matched by run overlap); up to 25 per page, pages 1–40sortisrelevance,start_desc, orstart_asc, defaulting to relevance with a query andstart_descwithout;statusis the museum's label and doesn't say whether a show is open (whendoes)Rows carry dates, gallery, summary, web page, image,
artist_ids, and theartworksshown when the museum lists them
artic_search_audio_guide tool
queryis required and matches stop titles and transcripts (every word); up to 20 stops per page (default 5)Each stop has
title,audio_url(MP3), andtranscriptbut no artwork id; every response carrieslicense_textandsource_citation, since the content is for noncommercial educational and personal use
artic_lookup_vocabulary tool
vocabularyis one ofdepartment,artwork_type,style,subject,classification,place_of_origin,gallery,material,technique, ortheme; optionalcontainssubstring (case-insensitive),public_domain_only, and up to 100 values (default 25)Values come back most common first with
artwork_count, in the exact form the matchingartic_search_artworksfilter accepts;filter_paramnames that filter and is absent formaterial,technique, andtheme, which work as query text
artic://artworks/{id} resource
{ artwork, license_text, description_attribution?, notice? }asapplication/json, whereartworkis theartic_get_artworksrecord with its default sections and related mediaAn unknown id fails as
artwork_not_found; ids come fromartic_search_artworks
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
Art Institute-specific:
Keyless access to the Art Institute of Chicago public API (
api.artic.edu/api/v1); IIIF image URLs are built from each record (843 px for every image, 1686 px and a IIIF manifest for public-domain works), never fetchedOne shared request pacer under the API's published limit of 60 requests a minute, retries for transient failures inside a 20-second deadline, and an in-process response cache (records 6 hours, searches 15 minutes, vocabularies 24 hours), so a repeated call spends no rate budget
Text search requires every word to match, so totals are real and a miss reads as zero hits, while results keep the museum's own relevance order
Placeholder years in the museum's data (outside −8000 to 2100) are left out of output, year filters, and date sorts;
date_displaystays the authority
Agent-friendly output:
Rights travel with the data:
image.rights(public_domain/in_copyright) on every image, with the 1686 px URL only where reuse is allowed; the API'slicense_textverbatim;description_attributionwhen CC BY text is returned; andsource_citationon audio-guide resultsPartial results instead of failures:
artic_get_artworksreportsmissing_idsanddeferred_ids, and when a secondary lookup (related media, artist counts) fails, the primary records still return with anoticenaming what is missingPaging that names the next move:
totalCount,has_more,next_page, and anoticewith the next page, the 1,000-match ceiling, or the filter to loosen after zero hits; facet and vocabulary values come back in the exact form the filters accept
Data and licensing
The Art Institute of Chicago licenses its API data by surface, and the server passes the API's own license_text through with every artwork, artist, exhibition, and audio-guide result:
Content | Terms |
Artwork metadata, artists, exhibitions, vocabulary terms, related media | CC0 |
Artwork | CC BY 4.0: credit the Art Institute of Chicago and cite the record's |
Artwork images | Reusable only for public-domain works ( |
Audio-guide content | Noncommercial educational and personal use, with copyright notices kept and the source cited |
This server is an independent project and is not affiliated with or endorsed by the Art Institute of Chicago.
Known limitations
Only the first 1,000 matches of any search are reachable without an authenticated key. Broad questions need filters or facets.
The API's limit of 60 requests a minute is per egress IP, so every client behind one IP shares it. Bursts queue behind the pacer, and a call that cannot start within its 20-second budget fails as
rate_limited.Curatorial text is sparse: about 10% of artworks have a
description, and in a general sample 94% lack provenance. About 1% of artists have a biography, and there is no nationality field, onlyartist_displayprose.About 15 artworks carry placeholder years and about 4,900 carry no dates; neither matches a year filter.
Some vocabulary titles are stored cut at 40 characters in the museum's own data (
gelatin silver (developing-out-paper) pr). Filters match them only as stored, so pass values asartic_lookup_vocabularylists them.The API's firewall refuses any request whose text contains markup such as
<script>; the call fails asrequest_blocked.About 4% of exhibitions list their artworks, and
statusdoesn't indicate whether a show is open.Audio-guide stops have no artwork link. Some titles are file names, and some transcripts are in Spanish.
Image URLs can stop resolving when the museum unpublishes or replaces an image, and relevance order follows the museum's own ranking, which may shift as its models change.
Getting started
Add the following to your MCP client configuration file. No API key is needed; AIC_CONTACT tells the museum how to reach you (see Configuration).
{
"mcpServers": {
"art-institute-chicago-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/art-institute-chicago-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"AIC_CONTACT": "you@example.com"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"art-institute-chicago-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/art-institute-chicago-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"AIC_CONTACT": "you@example.com"
}
}
}
}Or with Docker:
{
"mcpServers": {
"art-institute-chicago-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "-e", "AIC_CONTACT=you@example.com", "ghcr.io/cyanheads/art-institute-chicago-mcp-server:latest"]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.4.0 or higher (or Node.js v24+).
No API key or account. The Art Institute API asks clients to identify themselves with a contact; set
AIC_CONTACTto an email or URL.
Installation
Clone the repository:
git clone https://github.com/cyanheads/art-institute-chicago-mcp-server.gitNavigate into the directory:
cd art-institute-chicago-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env and set AIC_CONTACTConfiguration
Variable | Description | Default |
| Contact the museum can reach (an email or URL), sent in the |
|
| Outbound requests per minute to |
|
| Transport: |
|
| HTTP server port. |
|
| HTTP session mode: |
|
| Authentication: |
|
| Log level ( |
|
| Directory for log files (Node.js only). |
|
| Storage backend: |
|
| Enable OpenTelemetry. |
|
See .env.example for every server setting and the common framework overrides.
Running the server
Local development
Build and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdioRun checks and tests:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Project structure
Directory | Purpose |
|
|
|
|
| Tool definitions ( |
| The |
| Art Institute API client: pacing, retries, response cache, HTML-to-text, IIIF URL construction, and the artwork and artist record builders. |
| Unit and integration tests, mirroring the |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor logging,ctx.enrichfor paging and noticesRegister new tools and resources in the barrels under
src/mcp-server/*/definitions/index.tsWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Art Institute of Chicago MCP — wraps the ARTIC public API (free, no auth)
Search the Met collection, browse by department or update date, fetch full records and CC0 images.
Art MCP — Metropolitan Museum of Art Collection API (free, no auth)
Free primary-source APIs across 8 categories, with provenance envelopes.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceAllows you to search for artworks, retrieve detailed information about specific artworks, access image tiles for artworks, and explore user-created collections from the Rijksmuseum.29 npm72MIT
- AlicenseBqualityCmaintenanceA server that provides access to the Art Institute of Chicago Collection through natural language interactions. This server allows AI models to search the Art Institute of Chicago Collection and have art works available as a Resource.615 npm5MIT
- AlicenseNot gradedqualityBmaintenanceEnables querying the Cleveland Museum of Art's open access API to search artworks by filters like type, artist, and CC0 status, retrieve details by accession number, find creators, and explore exhibitions.251 npm1MIT
- AlicenseBqualityDmaintenanceEnables AI agents to search and explore over 570,000 artworks from the Metropolitan Museum of Art and Art Institute of Chicago without needing an API key.92MIT