Art Institute Chicago Mcp Server

io.github.cyanheads由 GitHub 账号 cyanheads 发布v0.3.1更新于 Nov 4, 2026

Search the Art Institute of Chicago collection: artworks, artists, exhibitions, and audio guides.

已验证Streamable HTTP可网页运行网页搜索与抓取知识与记忆媒体与设计

概览

AI 生成的概览

检索芝加哥艺术博物馆馆藏——艺术品、艺术家、展览与语音导览——支持筛选、完整记录与版权信息。

可以做什么
  • 按文本和结构化条件检索艺术品,附分面计数与日期或入藏年份排序
  • 批量获取艺术品完整记录:描述、来源、展览与出版历史、带权利状态的图片链接、相关媒体
  • 按名称或 ID 查找艺术家、文化群体与机构,含生卒年、作品数量与代表作品
  • 按文本、日期、艺术品 ID 或艺术家 ID 检索往期、当前与即将举办的展览
  • 按标题与文字稿检索语音导览站点,返回 MP3 链接与文字稿
  • 列出检索筛选器可接受的确切取值及对应作品数量
适用场景
适合让助手研究芝加哥艺术博物馆馆藏中的作品、艺术家、来源或展览历史,或为某主题查找公有领域图片与语音导览内容。它只做只读的馆藏查询,不是通用网页搜索。
运行要求
可作为托管远程端点使用,也可通过 npx 本地运行(需 Node.js;源码构建需 Bun 或 Node.js 24+)。无需 API 密钥或账号。需将 AIC_CONTACT 设为可联系的邮箱或网址,随 AIC-User-Agent 请求头发送;AIC_REQUESTS_PER_MINUTE 默认 50。需要访问 api.artic.edu。
安装前请注意
仅只读,但博物馆 API 按出口 IP 限流,托管实例的所有调用方共享同一配额,调用可能以 rate_limited 失败。AIC_CONTACT 会随每次请求发送给博物馆。各内容复用条款不同:描述为 CC BY 4.0,图片仅限公有领域作品,语音导览内容仅限非商业用途。馆藏文本是博物馆撰写的数据,不是指令。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Art Institute Chicago Mcp Server,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.cyanheads%2Fart-institute-chicago-mcp-server/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "art-institute-chicago": {
      "type": "http",
      "url": "https://art-institute-chicago.caseyjhand.com/mcp"
    }
  }
}

README

@cyanheads/art-institute-chicago-mcp-server

Search the Art Institute of Chicago collection: artworks, artists, exhibitions, and audio guides via MCP. STDIO or Streamable HTTP.

6 Tools • 1 Resource


Overview

The Art Institute of Chicago's collection: about 133,000 artworks, plus artists, exhibitions, and audio-guide stops. Search with filters and facet counts, read full records with provenance and IIIF image URLs, and search audio-guide transcripts. No API key required.

Tools

ToolDescription
artic_search_artworksSearch artworks by text and filters, with facet counts and date or acquisition-year sorting
artic_get_artworksFetch full records for up to 100 artworks: description, provenance, histories, image URLs with rights status, related media
artic_search_artistsFind artists, cultures, and organizations by name or id, with available Getty ULAN identifiers, life dates, artwork counts, and sample works
artic_search_exhibitionsSearch past, current, and upcoming exhibitions by text, date, artwork id, or artist id
artic_search_audio_guideSearch audio-guide stops by text: title, MP3 URL, and transcript
artic_lookup_vocabularyList the values a search filter accepts, with artwork counts

Resources

ResourceDescription
artic://artworks/{id}One artwork record as JSON, with the API license text and description attribution

artic_get_artworks returns the same record for clients that don't surface resources.

Skills

SkillDescription
art-institute-chicago-guideGates and workflows the tool descriptions don't carry: finding works by an artist or culture, a work's exhibition history, counts past the 1,000-match window, provenance research and acquisition years, audio-guide stops versus linked media, accent-exact filter values, and reuse terms per output

The server serves it over MCP as skill://art-institute-chicago-guide/SKILL.md; it also ships in skills/ in the npm package and Docker image.

Capability reference

Searches and vocabulary lookup accept limits up to 1,000, and the response states the cap actually applied: 100 rows for artworks, artists, exhibitions, and the audio guide, and 1,000 values for vocabulary. Defaults are 10 rows (audio guide 2, vocabulary 25). Keep the same requested limit when following next_page; page times applied size must stay within 1,000. At the vocabulary cap, narrow with contains.

artic_search_artworks tool

  • query (every word must match, except common English words such as the and of, which are ignored; "exact phrase", -exclude, and a | b work) plus filters artist, artist_id, department, artwork_type, style, subject, classification, material, technique, theme, place_of_origin, gallery, year_from / year_to (date-span overlap, negative for BCE), acquired_from / acquired_to (fiscal year of acquisition, inclusive; works with no recorded year never match), public_domain_only, on_view_only, and has_image, combined with AND
  • Up to 100 rows per page (default 10), within the first 1,000 matches; rows carry main_reference_number and, when recorded, acquisition_fiscal_year. sort is relevance, date_asc, date_desc, acquired_desc (recent acquisitions first), or acquired_asc; works missing the sorted field come last, and sort_applied reports popularity when relevance had no query text
  • facets adds the top 15 values for any of 11 fields (the ten vocabularies and artist; artist counts every credited artist and rows carry artist_id); limit: 0 returns counts only

artic_get_artworks tool

  • ids takes up to 1,000 entries (comma strings up to 100,000 characters); blanks and duplicates are dropped and artwork page URLs are read as ids. The first 100 are fetched; sections chooses from description and provenance (default), exhibition_history, publication_history, and catalogue, and is the size lever: every section on 100 well-documented works comes to about 1.4 MB
  • Records return whole, in request order. missing_ids lists ids the museum doesn't have; deferred_ids lists ids past the first 100, to pass to the same tool again
  • include_related_media (default on) loads up to 100 linked lectures and audio stops; description_attribution appears whenever CC BY description text is returned

artic_search_artists tool

  • query (all name words must match) or ids, not both; ids takes up to 1,000 entries (comma strings up to 100,000 characters) and the first 100 are fetched. Query mode adds artists_only (default true), born_from / born_to, and up to 100 agents per page
  • Each agent carries artwork_count, up to three sample_works (the museum's highlights first), life years, and alt_names; ids mode reports missing_ids and deferred_ids to pass as ids in the next call
  • ulan_id is the Getty ULAN identifier when the museum records one; coverage is sparse, and it is distinct from the museum id used by other tools

artic_search_exhibitions tool

  • query, when (current, upcoming, past, or the default any), date_from / date_to (YYYY-MM-DD, matched by run overlap), and exact artwork_id / artist_id filters, combined with AND; up to 100 per page within the first 1,000 matches. query ignores common English words such as the and of
  • Relationship filters cover recorded museum links; absent links do not prove an artwork or artist never appeared in a show
  • sort is relevance, start_desc, or start_asc, defaulting to relevance with a query and start_desc without; status is the museum's label and doesn't say whether a show is open (when does)
  • A missing date is unrecorded, not a run that did not happen: a show with no closing date is past when marked Closed, else current from its opening, and a date window reads it as running on its opening date alone (Closed) or on from it; a show with only a closing date ran on that date alone, and one with no dates matches no window
  • Rows carry dates, gallery, summary, web page, image, artist_ids, and the artworks shown, when the museum lists them

artic_search_audio_guide tool

  • query is required and matches stop titles and transcripts (every word except common English words such as the and of, which are ignored); up to 100 whole stops per page (default 2)
  • Each stop has title, audio_url (MP3), and transcript but no artwork id; every response carries license_text and source_citation (content is for noncommercial educational and personal use)

artic_lookup_vocabulary tool

  • vocabulary is one of department, artwork_type, style, subject, classification, material, technique, theme, place_of_origin, or gallery; optional contains substring (ignoring case and accents, so applique finds appliqué (technique)), public_domain_only, and up to 1,000 values (default 25)
  • Values come back most common first with artwork_count, in the exact form the artic_search_artworks filter of the same name accepts; filter_param names that filter

artic://artworks/{id} resource

  • { artwork, license_text, description_attribution?, notice? } as application/json, where artwork is the artic_get_artworks record with its default sections and related media
  • An unknown id fails as artwork_not_found; ids come from artic_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 fetched
  • One 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)
  • Text search requires every word to match, except common English words such as the and of, which are ignored, so totals are real and a miss reads as zero hits; results keep the museum's relevance order
  • Placeholder years in the museum's data (outside −8000 to 2100) are left out of output, year filters, and date sorts; date_display stays the authority. Date and acquisition sorts keep works with no value for the sorted field and list them last

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's license_text verbatim; description_attribution when CC BY text is returned; source_citation on audio-guide results
  • Partial results instead of failures: artic_get_artworks reports missing_ids and deferred_ids, and when a secondary lookup (related media, artist counts) fails, the primary records still return with a notice naming what is missing
  • Paging that names the next move: totalCount, has_more, next_page, and a notice for the next page, the 1,000-match ceiling, or the filter to loosen after zero hits

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:

ContentTerms
Artwork metadata, artists, exhibitions, vocabulary terms, related mediaCC0
Artwork description textCC BY 4.0: credit the Art Institute of Chicago and cite the record's web_url
Artwork imagesReusable only for public-domain works (image.rights: "public_domain", CC0); other images need a rights check
Audio-guide contentNoncommercial 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. 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, only artist_display prose.
  • About 15 artworks carry placeholder years and about 4,900 carry no dates; neither matches a year filter.
  • About a third of artworks (47,677 of 133,165, 2026-11-03) have no recorded acquisition fiscal year; they never match acquired_from / acquired_to and sort last by acquisition year.
  • Some vocabulary titles are stored cut at 40 characters in the museum's data (gelatin silver (developing-out-paper) pr). Pass values as artic_lookup_vocabulary lists them.
  • The API's firewall refuses any request whose text contains markup such as <script>; the call fails as request_blocked.
  • About 4% of exhibitions list their artworks. 650 of 6,262 have no recorded closing date (2026-11-03); the date filters read those as described above.
  • 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 ranking, which may shift.

Getting started

Connect to the hosted instance, no install:

sh
claude mcp add --transport http art-institute-chicago-mcp-server https://art-institute-chicago.caseyjhand.com/mcp

Every caller of the hosted instance shares one api.artic.edu request budget of 50 requests a minute. For sustained use, run your own instance.

Or run it locally:

sh
claude mcp add art-institute-chicago-mcp-server -- npx -y @cyanheads/art-institute-chicago-mcp-server

For other clients, add this to the MCP config file:

json
{  "mcpServers": {    "art-institute-chicago-mcp-server": {      "command": "npx",      "args": ["-y", "@cyanheads/art-institute-chicago-mcp-server"]    }  }}

No API key or account is needed. The Art Institute API asks clients to identify themselves: set AIC_CONTACT to an email or URL the museum can reach (see Configuration). For Docker or a source build, see Running the server.

Configuration

VariableDescriptionDefault
AIC_CONTACTEmail or URL the museum can reach, sent in the AIC-User-Agent header. Printable ASCII only; the server refuses to start otherwise. Set your own for any deployment.https://github.com/cyanheads/art-institute-chicago-mcp-server
AIC_REQUESTS_PER_MINUTEOutbound requests per minute to api.artic.edu, 1–600. Stays under the API's published limit of 60; raise it only if the museum grants a higher one.50
MCP_TRANSPORT_TYPETransport: stdio or http.stdio
MCP_HTTP_PORTHTTP server port.3010
MCP_SESSION_MODEHTTP session mode: stateless, stateful, or auto. Overrides the server's declared posture.stateless
MCP_AUTH_MODEAuthentication: none, jwt, or oauth.none
MCP_LOG_LEVELLog level (debug, info, warning, error, etc.).info
LOGS_DIRDirectory for log files (Node.js only).<app-root>/logs
STORAGE_PROVIDER_TYPEStorage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1.in-memory
OTEL_ENABLEDEnable OpenTelemetry.false

See .env.example for every server setting and the common framework overrides.

Running the server

Local development

Requires Bun v1.4.0 or higher (or Node.js v24+).

  • Clone and install:

    sh
    git clone https://github.com/cyanheads/art-institute-chicago-mcp-server.gitcd art-institute-chicago-mcp-server && bun installcp .env.example .env   # set AIC_CONTACT
  • Build and run:

    sh
    # One-time buildbun run rebuild
    # Run the built serverbun run start:stdio# orbun run start:http
  • Run checks and tests:

    sh
    bun run devcheck   # Lint, format, typecheck, securitybun run test       # Vitest test suitebun run lint:mcp   # Validate MCP definitions against spec

Docker

sh
docker run --rm -e [email protected] -p 3010:3010 ghcr.io/cyanheads/art-institute-chicago-mcp-server:latest

The image defaults to HTTP transport, stateless session mode, and logs to /var/log/art-institute-chicago-mcp-server. To run it over stdio from an MCP client, use "command": "docker" with "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "-e", "[email protected]", "ghcr.io/cyanheads/art-institute-chicago-mcp-server:latest"]. To build locally, docker build -t art-institute-chicago-mcp-server .; OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.

Project structure

DirectoryPurpose
src/index.tscreateApp() entry point: registers the tools and resource, sets the server instructions, and starts and stops the API service.
src/configAIC_CONTACT and AIC_REQUESTS_PER_MINUTE parsing and validation with Zod.
src/mcp-server/toolsTool definitions (*.tool.ts) and the artwork output schema they share.
src/mcp-server/resourcesThe artic://artworks/{id} resource.
src/services/aicArt Institute API client: pacing, retries, response cache, HTML-to-text, IIIF URL construction, and the artwork and artist record builders.
skills/The published art-institute-chicago-guide Agent Skill, served over MCP.
tests/Unit and integration tests, mirroring the src/ structure.

Development guide

See CLAUDE.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for logging, ctx.enrich for paging and notices
  • Register new tools and resources in the barrels under src/mcp-server/*/definitions/index.ts
  • Wrap 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:

sh
bun run devcheckbun run test

License

This project is licensed under the Apache 2.0 License. See the LICENSE file for details.

来源:README.md,提交 90dc2e9

工具

6

artic_search_artworks

Search artworks

Search the Art Institute of Chicago collection by text and structured filters, ranked by relevance or sorted by date or acquisition year. Text matches all words across titles, artists, descriptions, provenance, and other catalog fields; common English words such as the and of are ignored. Filters combine with AND. Results reach the first 1,000 matches; narrow with filters for more. Set limit to 0 with facets to get only counts. Use artic_lookup_vocabulary for filter values and artic_get_artworks for full records.

输入参数pagesortlimitquerystylethemeartistfacetsgallerysubjectyear_tomaterial另有 12 个

artic_get_artworks

Get artworks

Fetch full Art Institute of Chicago records for up to 100 artworks by id in one call, returning deferred_ids for the rest: description, provenance, exhibition and publication history, dimensions, inscriptions, credit line, categorization, gallery, image URLs with rights status, and related multimedia. The long text sections are opt-in through sections; request the sections and ids your client can take, since every section on 100 well-documented works comes to about 1.4 MB. Ids come from artic_search_artworks, artic_search_exhibitions, or artic_search_artists.

输入参数ids必填sectionsinclude_related_media

artic_search_artists

Search artists

Find artists, cultures, and organizations in the Art Institute of Chicago collection by name, or fetch them by id. Each result carries life dates, agent type, alternate names, how many of the museum's artworks credit them, and up to three of their works, the museum's highlighted works first. Pass an id to artic_search_artworks as artist_id to browse all of their works.

输入参数idspagelimitqueryborn_toborn_fromartists_only

artic_search_exhibitions

Search exhibitions

Search Art Institute of Chicago exhibitions by text, date, artwork_id, or artist_id. Relationship filters cover recorded museum links; an absent link does not prove an artwork or artist never appeared in a show. For the full exhibition record of one artwork, read the exhibition_history section of artic_get_artworks. Results carry dates, gallery, summary, web page, and listed artworks. Pass artwork ids to artic_get_artworks for full records.

输入参数pagesortwhenlimitquerydate_toartist_iddate_fromartwork_id

artic_search_audio_guide

Search audio guide

Search the Art Institute of Chicago's mobile audio-guide stops by text, matching stop titles and transcripts. Returns each stop's title, MP3 URL, and transcript text. Stops carry no artwork id, so match a stop to a work by its title; for a known artwork, artic_get_artworks related_media lists the recordings linked to it. Some stops are in Spanish, and titles are sometimes internal file names. This content is for noncommercial educational and personal use only: keep the copyright notice and cite the Art Institute of Chicago.

输入参数pagelimitquery必填

artic_lookup_vocabulary

Look up collection vocabulary

List the values of an Art Institute of Chicago collection vocabulary with how many artworks carry each, most common first, optionally narrowed by a substring. Each value passes to the artic_search_artworks filter of the same name exactly as listed (case is ignored). Counts here span the whole collection; for counts within a filtered set of artworks, request facets from artic_search_artworks.

输入参数limitcontainsvocabulary必填public_domain_only

版本历史

6
  1. v0.3.1最新Nov 4, 2026
  2. v0.3.0Oct 29, 2026
  3. v0.2.1Oct 25, 2026
  4. v0.2.0Oct 13, 2026
  5. v0.1.2Oct 2, 2026
  6. v0.1.1Oct 1, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分