关于 smithsonian-mcp-server
面向需要探索史密森尼馆藏的研究者、教育工作者及内容创作者,提供跨 20 多家博物馆的开放藏品搜索。可获取 CC0 图像,并根据共享元数据发现馆藏之间的关联。
主要功能
- 01搜索跨馆藏藏品及目录元数据
- 02按博物馆、文化或主题浏览
- 03查询可用筛选词汇
- 04获取多分辨率 CC0 图像
- 05根据共享元数据查找关联藏品
适用场景
- 01查找特定主题或文化的馆藏
- 02筛选可下载的 CC0 图像
- 03浏览某个博物馆或时期的藏品
- 04从一件藏品发现跨馆关联
MCP 相关
向 MCP 客户端提供 6 个工具,用于搜索、浏览、读取藏品信息、获取 CC0 图像及发现关联对象。支持 STDIO 与 Streamable HTTP。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://smithsonian.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-smithsonian https://smithsonian.caseyjhand.com/mcp{"mcpServers":{"cyanheads-smithsonian":{"type":"http","url":"https://smithsonian.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-smithsonian":{"type":"http","url":"https://smithsonian.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-smithsonian":{"type":"http","url":"https://smithsonian.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-smithsonian":{"serverUrl":"https://smithsonian.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
6| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| rows | integer | 否 | 每页数量(默认 20,最多 100)。 |
| query | string | 是 | 自由文本搜索。使用具体词语以提高精确度("Tlingit totem pole"),或使用宽泛词语进行浏览("quilt")。 |
| start | integer | 否 | 分页偏移量,从 0 开始计数。与 rows 配合使用,以分页浏览大型结果集。 |
| filters | object | 否 | 用于缩小搜索范围的可选结构化筛选条件。 |
| filters.date | string | 否 | 索引日期词条。年代("1920s"、"1960s")是最常见的形式,但词汇表也包含年份范围("500-1500")、世纪词条("21st century")和 BCE 形式("-2500"、"BCE 1000s")。该值必须是精确词条——完整集合可通过 smithsonian_list_terms(字段 "date")枚举。 |
| filters.name | string | 否 | 索引中的具名方——制作者、收藏者、捐赠者、发证机构或目录记录的任何其他角色。姓氏在前(例如 "Warhol, Andy")。无法通过 smithsonian_list_terms 枚举此字段。smithsonian_find_related 的 name 信号会原样携带索引形式,是可靠来源;smithsonian_get_object 的 makers[] 是目录中同一方的自由文本形式,书写方式通常不同(索引形式为 "Möller, Major J. A. L.",而 makers[] 中为 "Major J. A. L. Möller (Jacob A.L. Möller/Monty Möller), Non-Indian, 1883-1957"),因此应将其视为初步线索。 |
| filters.place | string | 否 | 地理地点(例如 "United States of America")。完整集合可通过 smithsonian_list_terms(字段 "place")枚举。 |
| filters.topic | string | 否 | 来自受控词汇表的主题词(例如 "Quilts"、"Aviation")。与 smithsonian_get_object 返回的 topics[] 值匹配,并作为硬性条件——主题 "Quilts" 匹配 1,134 件藏品,而同一词语作为自由文本时匹配 2,677 件。完整集合可通过 smithsonian_list_terms(字段 "topic")枚举。 |
| filters.culture | string | 否 | 来自受控词汇表的文化词条,通常为复数或带限定词(例如 "Aztecs"、"Plains Indian")。可通过 smithsonian_list_terms(字段 "culture")枚举词汇表。 |
| filters.cc0_only | boolean | 否 | 为 true 时,仅返回附带 CC0 授权媒体的记录(Lucene 词项 media_usage:CC0)。此条件筛选的是媒体是否存在,而非授权状态——被排除的约 920 万条记录同样是 CC0,只是没有任何数字化内容。请查看每个结果的 has_media,以判断 smithsonian_get_media 是否会返回内容。 |
| filters.unit_code | string | 否 | 博物馆部门代码(例如 "NASM"、"SAAM"、"NMAH"、"NMAAHC"、"NMAI"、"NPG"、"CHNDM"、"SIL");国家自然历史博物馆按学科子部门索引,例如 "NMNHBIRDS" 和 "NMNHPALEO",而非单独的 "NMNH"。完整集合可通过 smithsonian_list_terms(字段 "unit_code")枚举。 |
| filters.object_type | string | 否 | 来自 Smithsonian 受控词汇表的藏品类型词条,通常为复数(例如 "Paintings"、"Photographs"、"Aircraft")。像 "Painting" 这样的日常单数形式通常不会返回结果。此字段无法通过 smithsonian_list_terms 枚举;请从 smithsonian_search_objects 结果的 object_type 字段中收集有效值。匹配区分大小写且要求完全一致;大小写变体会被索引为独立类别——"button" 和 "Button" 各自包含自己的记录,且无法可靠判断哪个变体包含更多记录,因此应探测已收集值的其他大小写形式,而不要假定其中一种涵盖了整个概念。 |
| filters.online_only | boolean | 否 | 为 true 时,仅返回带有索引 online_media_type 值的记录。该词汇涵盖查找辅助工具、目录卡片、扫描书籍、全文和电子资源等数字化替代资料,也包括图像、3D 模型和视频;替代资料类型通常没有可交付媒体,因此匹配结果仍可能报告 has_media: false。请查看每个结果的 has_media,以判断 smithsonian_get_media 是否会返回内容。 |
详细介绍
@cyanheads/smithsonian-mcp-server
通过 MCP 搜索史密森尼博物馆 20 多家博物馆中的 1,450 万件开放访问藏品,并获取其中 520 万件带有开放许可媒体的 CC0 图片。支持 STDIO 或 Streamable HTTP。
概述
史密森尼博物馆的开放访问目录:涵盖 20 多家博物馆的 1,450 万件藏品,其中 520 万件附有 CC0 图片。可通过自由文本或类别搜索,按博物馆、文化、日期或主题浏览,并探索各馆藏之间的关联。
工具
| 工具 | 描述 |
|---|---|
smithsonian_search_objects | 按文本查询搜索 1,450 万件藏品,并可使用可选筛选条件(博物馆、类型、日期术语、文化、地点、主题、名称、学名、媒体类型、仅限在线、CC0)。返回整理后的摘要及总数。 |
smithsonian_list_terms | 列出已索引筛选字段的有效术语词汇表(unit_code、culture、place、date、online_media_type、topic)。筛选前先调用,以免无效值导致结果为空;传入 contains 可将猜测的值解析为准确术语。unit_code 术语会附带博物馆名称。 |
smithsonian_get_object | 根据 ID 获取对象的规范化目录元数据投影:标题、日期、材料、尺寸、展览历史、鸣谢信息和标识符。 |
smithsonian_get_media | 返回对象所有采用 CC0 许可的图像,提供多种分辨率(缩略图、屏幕尺寸、高分辨率 JPEG/TIFF)。只返回 CC0 图像,且不会返回空列表;若对象尚未数字化、仅有非图像媒体或仅有受限图像,会通过不同的错误原因说明情况。 |
smithsonian_browse_category | 浏览某个精确类别(博物馆、文化、时期、媒介、主题)中的对象,并返回总数、一页对象和博物馆细分统计。必须使用准确的已索引类别术语。 |
smithsonian_find_related | 根据共同的文化、具名对象、主题和时期特征,发现与锚点对象相关的跨藏品对象。 |
功能参考
smithsonian_search_objects 工具
- 在 20 多家博物馆的 1,450 万件藏品中进行全文搜索
- 筛选条件会追加严格的
AND约束。普通单词和带引号的短语保留其匹配语义;活动的 Lucene 表达式会分组,以保留布尔优先级。 filters.online_media_type接受smithsonian_list_terms中的准确媒体类别,例如Images、3D Models和Sound recordings。这些类别描述的是索引内容;即使是Images,也不保证附有图像或 CC0 图像。请检查smithsonian_get_object.media_summary,确认是否可获取媒体。媒体类别可用于搜索,但没有媒体类型浏览模式。- 筛选条件:博物馆单元代码、对象类型、已索引日期术语(
1920s、500-1500、21st century、-2500)、文化、地理位置、主题、具名对象(name)、学名(scientific_name)、已索引媒体类别(online_media_type)、仅限在线、仅限 CC0 topic和name是严格的已索引约束,而不是全文搜索;topic: "Quilts"匹配 1,134 件对象,而不带筛选的词语匹配 2,677 件;name: "Warhol, Andy"匹配 421 件,而不带筛选的词语匹配 715 件- 返回整理后的摘要:标题、日期、博物馆、对象类型、缩略图 URL、CC0 标记、
record_id - 使用
start+rows进行标准分页(基于偏移量,每页最多 100 条)
smithsonian_list_terms 工具
- 字段:
unit_code、culture、place、date、online_media_type、topic——受控词汇表,术语通常为复数形式(例如Paintings,而非Painting);搜索或浏览前,请先在此确认筛选值 contains根据不区分大小写的子字符串筛选词汇表,可通过一次调用将猜测的值解析出来(例如greek→Greek, Attic);对于unit_code,它也会匹配博物馆名称(National Air and Space→NASM),且每个unit_code术语都会附带一个映射博物馆名称的labels字段- 使用
start+rows分页(默认 50,每页最多 100 条);topic(13.3 万个术语)和place(11.4 万个术语)的词汇量较大,适合与contains搭配使用 - 上游不提供每个术语对应的对象数量,只提供术语本身
- 每个字段的词汇表都会按
SMITHSONIAN_TERMS_CACHE_TTL_SECONDS缓存(默认 3600 秒,0表示禁用);上游忽略分页,每次调用都会返回完整集合,因此未缓存时分页获取大型词汇表会反复下载 - 此处无法枚举
object_type;请从smithsonian_search_objects结果中的object_type字段获取其值
smithsonian_get_object 工具
- 输入:来自
smithsonian_search_objects的record_id——请勿手动构造 ID - 返回公开的目录字段:标题、日期(均带标签)、制作者(含角色)、材料、尺寸、地点关联、文化术语、主题/对象术语、展览历史、登录编号、署名行、权利声明
- 包含媒体摘要——如需完整图片 URL,请调用
smithsonian_get_media - 所有非空备注均保留其目录标签和来源顺序。
description会选取可识别的文本标签;行政备注仍保留标签。 - 自然历史元数据包括所有
scientific_names、报告的taxonomy层级,以及有效的十进制藏品coordinates(若有,还包括其对应地点)。没有名称或有效坐标时,数组为空;缺失的层级会省略。不推断接受名、地理编码结果或精度。搜索时,将scientific_names用作确切的filters.scientific_name值;此字段无法通过smithsonian_list_terms枚举。
smithsonian_get_media 工具
- 仅返回 CC0 许可的图片,绝不返回受限内容
- 无内容可返回时有三种不同的失败原因:
no_media(没有数字化内容)、no_images(存在媒体,但全都不是图片——扫描书籍、3D 模型、录音;恢复提示会列出存在的类型)、not_cc0(存在图片,但没有 CC0 图片;以Forbidden抛出) - 每个图片条目都包含缩略图(约 120px)、屏幕尺寸图片(约 800px)以及高分辨率 JPEG/TIFF URL,并附像素尺寸
- 调用此工具前,使用
smithsonian_search_objects和filters.cc0_only: true查找包含可下载 CC0 图片的对象
smithsonian_browse_category 工具
- 五种模式:
museum(按机构代码筛选,例如"NASM"——精确匹配,不按博物馆名称匹配)、culture(例如"Aztecs")、period(已索引的日期术语,例如"1940s"或"500-1500")、medium(对象类型,例如"Paintings")、topic(主题术语,例如"Quilts") value必须是已索引的确切类别术语——先用smithsonian_list_terms查询museum、culture、period和topic词汇;object_type无法通过该工具枚举,因此需从smithsonian_search_objects结果中获取- 返回总数、一页样例对象,以及显示哪些机构持有匹配藏品的博物馆分布(根据当前页计算)
- 使用
start+rows进行标准分页(基于偏移量,start = page × rows,每页最多 50 条)——相邻页面可获取上限样例中遗漏的对象 - 与任何对象都不匹配的类别值会触发
invalid_category,并附带针对该模式的恢复提示:词汇表以外的值会提供可解析该值的确切smithsonian_list_terms调用;索引中有列出但未匹配到任何对象的值则会明确指出,并引导至其他位置 - 对于开放式或主题探索,请改用
smithsonian_search_objects——此工具要求提供确切的类别值
smithsonian_find_related 工具
- 将共同文化、具名方、主题以及时期 + 类型元数据,与更广泛的目录进行匹配;跨博物馆发现是其差异化优势——以 NASM 航空航天藏品为锚点,可能会找到来自 NMNH、SAAM 和 NMAH 的相关藏品
- 具名方信号采用目录中该方自身的角色(
maker、collector、donor、issuing authority等),而非固定的maker标签;如果记录中有索引name分面,则优先将其用作硬筛选条件;如果其值只是重复文化信号,则会舍弃该信号 - 主题信号是硬性
topic:筛选条件,因此每件匹配的藏品都带有该主题词,而非仅仅提及该词 - 每个结果中的
similarity_signals会列出所有将其与锚点关联起来的元数据词项——如果一件藏品由多个信号匹配,则会包含所有这些信号 - 使用
start分页——它是交错排列的相关结果集中的 0 起始偏移量,start = page × limit;每个信号最多可获取 5,000 条结果(按每块 ≤1,000 行获取——较深的页面可能会在分页边界附近造成范围有限的结果位置偏移);响应被截断时会报告truncationCeiling,作为可访问相关结果池的上限 signals[]按信号细分扩展结果:row_count是该信号在上游的实际结果数(不设上限,因此可能超过 5,000 条可访问范围),search_continuation则是可在任意深度获取该信号完整匹配集的确切smithsonian_search_objects输入——这是获取超出此工具单信号访问范围结果的途径- 部分失败会在分页说明的同一通知中,以安全类别标明失败的信号。成功但无结果时,会区分缺少锚点信号、没有非锚点匹配项以及页面已耗尽。所有搜索均失败时,会以首个信号的失败原因拒绝;调用方取消操作时始终会拒绝。
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可替换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及支持可选 OpenTelemetry 跟踪的结构化日志记录。
Smithsonian 专属功能:
- 封装 Smithsonian Open Access API(涵盖 20 多家博物馆的 1,450 万件藏品,其中 520 万件带有 CC0 媒体),使用免费的
api.data.gov密钥 smithsonian_get_media实施 CC0 限制——只返回开放访问图像,绝不返回受限内容smithsonian_find_related支持优雅降级——某个元数据信号失败不会中止其余操作- 统一不同博物馆异构元数据架构的响应格式
面向 Agent 的输出:
- 每个藏品摘要都包含
has_media——Agent 无需额外查询即可判断是否调用图像下载;is_cc0标记的是元数据许可证,而 Open Access 语料中的几乎所有藏品都带有此许可证 - 提供带类型的错误原因(
no_results、invalid_filter、not_found、no_media、no_images、not_cc0、invalid_id),并为每种情况提供恢复提示 - 相关藏品结果中的
similarity_signals让 Agent 能够说明藏品被展示的原因 - 所有搜索响应都包含
total_count,使 Agent 能在分页前说明结果范围
开始使用
公共托管实例
公共实例位于 https://smithsonian.caseyjhand.com/mcp——无需安装。通过 Streamable HTTP 将任意 MCP 客户端指向该实例:
{
"mcpServers": {
"smithsonian-mcp-server": {
"type": "streamable-http",
"url": "https://smithsonian.caseyjhand.com/mcp"
}
}
}
自托管 / 本地运行
需要免费的
api.data.govAPI 密钥——请前往 https://api.data.gov/signup 注册,并在配置中设置SMITHSONIAN_API_KEY。
将以下内容添加到 MCP 客户端配置文件中:
{
"mcpServers": {
"smithsonian-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/smithsonian-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"SMITHSONIAN_API_KEY": "your-api-key"
}
}
}
}
也可以使用 npx(无需 Bun):
{
"mcpServers": {
"smithsonian-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/smithsonian-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"SMITHSONIAN_API_KEY": "your-api-key"
}
}
}
}
也可以使用 Docker:
{
"mcpServers": {
"smithsonian-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "SMITHSONIAN_API_KEY=your-api-key",
"ghcr.io/cyanheads/smithsonian-mcp-server:latest"
]
}
}
}
使用 Streamable HTTP 时,设置传输方式并启动服务:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 SMITHSONIAN_API_KEY=your-api-key bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
- Bun v1.4.0 或更高版本(或 Node.js v24+)。
- 免费的
api.data.govAPI 密钥 — 在 https://api.data.gov/signup 注册。审核即时完成。
安装
- 克隆仓库:
git clone https://github.com/cyanheads/smithsonian-mcp-server.git
- 进入目录:
cd smithsonian-mcp-server
- 安装依赖项:
bun install
- 配置环境:
cp .env.example .env
# Edit .env and set SMITHSONIAN_API_KEY
配置
| 变量 | 描述 | 默认值 |
|---|---|---|
SMITHSONIAN_API_KEY | 必需。 从 api.data.gov/signup 获取的免费 API 密钥。 | — |
SMITHSONIAN_BASE_URL | Smithsonian Open Access API 基础 URL。 | https://api.si.edu/openaccess/api/v1.0 |
SMITHSONIAN_TERMS_CACHE_TTL_SECONDS | 缓存每个已索引字段的术语词汇表的秒数。0 表示禁用缓存。 | 3600 |
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_PORT | HTTP 服务的端口。 | 3010 |
MCP_SESSION_MODE | 会话模式:auto、stateful 或 stateless。服务在代码中声明为 stateless;仅在需要覆盖时设置此项。 | stateless |
MCP_AUTH_MODE | 身份验证模式:none、jwt 或 oauth。 | none |
MCP_LOG_LEVEL | 日志级别(RFC 5424)。 | info |
LOGS_DIR | 日志文件目录(仅限 Node.js)。 | <project-root>/logs |
STORAGE_PROVIDER_TYPE | 存储后端。 | in-memory |
OTEL_ENABLED | 启用 OpenTelemetry 插桩。 | false |
完整的可选覆盖项列表请参阅 .env.example。
运行服务
本地开发
-
构建并运行:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
运行检查和测试:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t smithsonian-mcp-server .
docker run --rm -e SMITHSONIAN_API_KEY=your-api-key -p 3010:3010 smithsonian-mcp-server
Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/smithsonian-mcp-server。默认会安装 OpenTelemetry 对等依赖项 — 若要省略这些依赖项,请使用 --build-arg OTEL_ENABLED=false 构建。
项目结构
| 目录 | 用途 |
|---|---|
src/index.ts | createApp() 入口点 — 注册工具并初始化 Smithsonian 服务。 |
src/config | 解析服务专用环境变量(SMITHSONIAN_API_KEY、SMITHSONIAN_BASE_URL、SMITHSONIAN_TERMS_CACHE_TTL_SECONDS)。 |
src/mcp-server/tools | 工具定义(*.tool.ts)。 |
src/services/smithsonian | Smithsonian Open Access API 客户端、规范化处理和类型定义。 |
tests/ | 单元测试和集成测试。 |
docs/ | 设计文档和目录树。 |
开发指南
开发指南和架构规则请参阅 CLAUDE.md / AGENTS.md。简要说明:
- 处理程序抛出异常,框架负责捕获 — 工具逻辑中不要使用
try/catch - 使用
ctx.log记录请求范围内的日志,使用ctx.state存储租户范围内的数据 - 在
src/index.ts的tools数组中注册新工具 - 封装外部 API 调用:验证原始数据 → 规范化为领域类型 → 返回输出架构;绝不虚构缺失字段
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
Apache-2.0 — 详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。