Swiss Cultural Heritage Mcp

io.github.malkreide由 GitHub 账号 malkreide 发布v0.6.0更新于 Oct 24, 2026

Swiss cultural heritage: SIKART artists, Nationalmuseum, Helveticat, Memobase, Dodis

概览

AI 生成的概览

让助手无需认证即可检索瑞士文化遗产数据源——SIKART 艺术家、国家博物馆藏品、Helveticat 书目、Memobase 与 Dodis。

可以做什么
通过五个瑞士文化遗产数据源提供十一个只读工具。艺术家工具可检索约 17,000 位 SIKART 艺术家并获取完整档案;博物馆工具可检索国家博物馆数据集并浏览藏品对象;图书馆工具通过 SRU 与 OAI-PMH 检索 Helveticat 并列出其 68 个集合。跨源检索工具可并行查询 SIK-ISEA、国家博物馆与国家图书馆,联邦门面(search_heritage、get_heritage_item、list_heritage_collections)覆盖 Memobase 与 Dodis,返回来源、永久链接以及分别标注的元数据与数字化对象许可。
适用场景
适合瑞士文化遗产相关的艺术、历史与文学研究问题:艺术家传记、博物馆藏品、国家书目记录、视听档案与外交文件。当助手需要依据机构一手资料而非通用网页结果作答时,值得添加。
运行要求
以 Python 本地进程通过 stdio 运行;需要 Python 3.11+ 以及 uv(推荐)或 pip。可通过 uvx swiss_cultural_heritage_mcp 或从仓库执行 pip install -e . 安装。未声明 API 密钥、账户或环境变量。需要访问上游瑞士文化遗产 API 的网络连接。另有可选的 HTTP 模式用于云端或浏览器部署。
安装前请注意
只读:所有工具仅执行 HTTP GET 请求,不写入、修改或删除数据。不索取任何凭据。仅返回元数据与链接,不复制受版权保护的全文;即使元数据开放,数字化对象也可能标注为 In Copyright。项目声明未核实国家图书馆 SRU 与 OAI-PMH 的使用条款,且许可脚注为来源的总体声明而非逐条记录声明。该项目为社区项目,与数据提供方无隶属关系。

安装

在 SourceWeft 中

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

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

🇨🇭 Part of the Swiss Public Data MCP Portfolio

🏛️ swiss-cultural-heritage-mcp

[Version] [License: MIT] [Python 3.11+] [MCP] [No Auth Required] [CI]

MCP Server for Swiss cultural heritage — SIK-ISEA artists, Nationalmuseum collections, and the Nationalbibliothek bibliography

🇩🇪 Deutsche Version


Overview

swiss-cultural-heritage-mcp provides AI-native access to Swiss cultural heritage data sources, all without authentication:

SourceDataAPI
SIK-ISEA (SIKART)~17,000 Swiss artists — SIKART biographical dataopendata.swiss CKAN
Nationalmuseum (SNM)Museum collections (numismatics, seals, special collections)opendata.swiss CKAN
Nationalbibliothek (NB)Swiss national bibliography (Helveticat)SRU (search) + OAI-PMH (collections)
Memoriav / MemobaseAudiovisual heritage (photo, audio, video)Linked Open Data (JSON-LD / Hydra)
DodisDiplomatic Documents of Switzerland (documents, persons, organisations)JSON-REST (Solr) + permalinks

This server completes the humanistic dimension of the Swiss public data portfolio — history, literature, and art — alongside existing servers for law (fedlex-mcp), transport, statistics, and more.

The memory-institution facade (Memobase + Dodis) is exposed through three federated tools — search_heritage, get_heritage_item, list_heritage_collections — rather than one tool-family per source. Every result carries source, permalink and licence, and the licence is reported separately for metadata and for the digitised object (they diverge: metadata is open Linked Open Data, but a digitised object may be In Copyright). Only metadata and links are returned — copyright-protected full texts (e.g. Dodis transcriptions) are never reproduced.

Anchor demo query (art): "Find works by Zurich-based painters from the 19th century in the Nationalmuseum, and cross-reference with their biography in the SIK-ISEA artist database."

Anchor demo query (memory institutions): "Which sources on the development of the Zurich Volksschule in the 19th century can be found in the Swiss memory institutions?" → search_heritage(query="Volksschule Zürich", collection="all", date_from="1800", date_to="1899").

Demo

[Demo: Claude using heritage_cross_search]


Features

  • 🏛️ 11 tools, 2 resources, 2 prompts across five data sources
  • 🔍 heritage_cross_search — parallel search across SIK-ISEA + SNM + NB in a single call
  • 🏛️ search_heritage — federated facade over Memobase + Dodis with per-result source, permalink and split metadata/digitised-object licence
  • 🌐 Bilingual output (Markdown / JSON)
  • 🔓 No API key required — all data under open licenses
  • ☁️ Dual transport — stdio (Claude Desktop) + Streamable HTTP (cloud)
  • 📚 Prompt templates for art research and finding educational materials

Project phase: Phase 1 — read-only. Every tool is annotated readOnlyHint: true; there are no write or destructive operations. Moving to Phase 2 (write-capable) requires the prerequisites in docs/roadmap.md.


Prerequisites

  • Python 3.11+
  • uv (recommended) or pip

Installation

bash
# Clone the repositorygit clone https://github.com/malkreide/swiss-cultural-heritage-mcp.gitcd swiss-cultural-heritage-mcp
# Installpip install -e .# or with uv:uv pip install -e .

Or with uvx (no permanent installation):

bash
uvx swiss-cultural-heritage-mcp

Quickstart

bash
# stdio (for Claude Desktop)python -m swiss_cultural_heritage_mcp.server
# Streamable HTTP (port 8000)python -m swiss_cultural_heritage_mcp.server --http --port 8000

Try it immediately in Claude Desktop:

"Who is Ferdinand Hodler?" "What coins does the Nationalmuseum have from Zurich?" "Find publications about Volksschule in the Swiss national bibliography"

→ More use cases by audience →


Configuration

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

json
{  "mcpServers": {    "swiss-cultural-heritage": {      "command": "python",      "args": ["-m", "swiss_cultural_heritage_mcp.server"]    }  }}

Or with uvx:

json
{  "mcpServers": {    "swiss-cultural-heritage": {      "command": "uvx",      "args": ["swiss-cultural-heritage-mcp"]    }  }}

Config file locations:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Cloud Deployment (SSE for browser access)

For use via claude.ai in the browser (e.g. on managed workstations without local software):

Render.com (recommended):

  1. Push/fork the repository to GitHub
  2. On render.com: New Web Service → connect GitHub repo
  3. Select region Frankfurt (EU) — required for Swiss public-sector use under revDSG / EDÖB. See docs/data-residency.md.
  4. Set start command: python -m swiss_cultural_heritage_mcp.server --http --port 8000
  5. In claude.ai under Settings → MCP Servers, add: https://your-app.onrender.com/sse

💡 "stdio for the developer laptop, SSE for the browser."

For container deployments (Docker / Kubernetes / Cloud Run): the repository ships a hardened Dockerfile (non-root UID 10001). See docs/security.md for recommended SecurityContext and docs/network-egress.md for egress policy. The service runs single-instance by default; before scaling horizontally, see docs/scaling.md for the session-affinity prerequisites.


Available Tools

SIK-ISEA (Swiss Art Research)

ToolDescription
heritage_search_artistsSearch ~17,000 Swiss artists (SIKART) by name or place
heritage_get_artistFull artist profile by SIKART ID (HAUPTNR)

Nationalmuseum (SNM)

ToolDescription
heritage_search_museum_datasetsSearch SNM datasets on opendata.swiss
heritage_browse_collectionBrowse objects within a collection via CKAN DataStore

Nationalbibliothek (NB)

ToolDescription
heritage_search_helveticatFull-text search over the whole holdings (SRU), or browse one collection (OAI-PMH)
heritage_list_nb_collectionsList the 68 available OAI-PMH sets
heritage_get_publicationSelected MARC21 fields for one publication, normalised to Dublin-Core-style keys (OAI-PMH GetRecord) — not the complete catalogue record

Cross-Source

ToolDescription
heritage_cross_searchParallel search across SIK-ISEA + SNM + NB

Memory institutions (Memobase + Dodis) — federated facade

ToolDescription
search_heritageFederated search over Memobase + Dodis (collection = memobase | dodis | all), with date_from / date_to / media_type filters. Every result carries source, permalink and a split metadata/digitised-object licence
get_heritage_itemFull metadata for one object (collection, item_id). Metadata + links only — protected full texts are never reproduced
list_heritage_collectionsDiscovery: which collections exist, their protocol, auth and licences — including the probed-but-not-connected sources (Bundesarchiv, Landesmuseum) and why

Example Use Cases

QueryTool
"Who is Ferdinand Hodler?"heritage_get_artist
"Find Swiss artists born in Basel"heritage_search_artists
"What coins from Zurich does the Nationalmuseum have?"heritage_browse_collection
"Find publications about Volksschule"heritage_search_helveticat
"Search for everything about Sophie Taeuber-Arp"heritage_cross_search
"Sources on the 19th-c. Zurich Volksschule in Swiss memory institutions"search_heritage

Architecture

┌─────────────────┐     ┌──────────────────────────────┐     ┌──────────────────────────┐│   Claude / AI   │────▶│  Swiss Cultural Heritage MCP  │────▶│  SIK-ISEA                ││   (MCP Host)    │◀────│  (MCP Server)                │◀────│  opendata.swiss / CKAN   │└─────────────────┘     │                              │     ├──────────────────────────┤                        │  11 Tools · 2 Resources      │────▶│  Nationalmuseum (SNM)    │                        │  2 Prompts                   │◀────│  opendata.swiss / CKAN   │                        │  Stdio | SSE                 │     ├──────────────────────────┤                        │                              │────▶│  Nationalbibliothek (NB) │                        │  No authentication required  │◀────│  Helveticat: SRU, OAI-PMH│                        │                              │     ├──────────────────────────┤                        │  search_heritage facade      │────▶│  Memobase (JSON-LD/Hydra)│                        │                              │◀────│  Dodis (JSON-REST/Solr)  │                        └──────────────────────────────┘     └──────────────────────────┘

Data Source Characteristics

SourceProtocolCoverageAuth
SIK-ISEA (SIKART)CKAN DataStore~17,000 Swiss artistsNone
NationalmuseumCKAN DataStoreMuseum collectionsNone
NationalbibliothekSRU 1.2 (CQL) + OAI-PMH 2.0Swiss national bibliographyNone
Memoriav / MemobaseLinked Open Data (JSON-LD / Hydra, RiC-O)Audiovisual heritage (~460k records)None
DodisJSON-REST (Solr) + stable permalinksDiplomatic documents, persons, organisationsNone

Architecture decision — memory-institution facade

Verified by a live probe on 2026-07-19 (methodology: mcp-data-source-probe). Four memory institutions were evaluated; only two expose a clean, no-auth, standardised interface and are connected:

SourceResultWhy
Memobase✅ connectedLinked-Open-Data API (api.memobase.ch, JSON-LD/Hydra); full-text search via ?q=, single record via /record/<id>; pagination via offset/size. Metadata open; digitised objects carry per-object rightsstatements.org rights ("In Copyright", access "onsite").
Dodis✅ connectedJSON-REST/Solr (beta.dodis.ch/api): search via POST /api/solr/query, item via GET /api/solr/full/<id>; stable permalinks dodis.ch/<id>. Metadata open (citation required); documents carry per-document rights (TEI/PDF behind the permalink).
Bundesarchiv⛔ not connectedThe recherche.bar.admin.ch backend (CMI AIS) sits behind eIAM login and Google reCAPTCHA — not machine-accessible without emulating a session, which is fragile and against the operator's intent.
Landesmuseum⛔ not connectedsammlung.nationalmuseum.ch has no public API (only an internal, undocumented Ajax/HTML surface) — connecting it would require scraping, which violates the resilience guardrails.

Consequences: three federated tools instead of four tool-families; every result carries source + permalink + a split metadata/digitised-object licence; no copyright-protected full text is reproduced (metadata + links only); bar and landesmuseum are documented as gated via list_heritage_collections, not scraped.


Project Structure

swiss-cultural-heritage-mcp/├── src/swiss_cultural_heritage_mcp/│   ├── __init__.py              # Package│   └── server.py                # 11 tools, 2 resources, 2 prompts├── tests/│   └── test_server.py           # Unit + integration tests (mocked HTTP)├── .github/workflows/ci.yml     # GitHub Actions (Python 3.11/3.12/3.13)├── .github/dependabot.yml       # Monthly dependency + SDK update PRs├── Dockerfile                   # Multi-stage, non-root, HEALTHCHECK├── docs/                        # security, network-egress, scaling, data-residency, roadmap├── pyproject.toml├── CHANGELOG.md├── CONTRIBUTING.md├── LICENSE├── README.md                    # This file (English)└── README.de.md                 # German version

Single-file server: the 11 tools live in one server.py rather than a tools/ package. At this size a single, linear module is easier to read and review than a split; if the tool count grows materially, the SIK-ISEA / SNM / NB / cross-search blocks are the natural split points.


Safety & Limits

  • Read-only: All tools perform HTTP GET requests only — no data is written, modified, or deleted.
  • No personal data: The APIs return institutional records (artworks, publications, artists). No personally identifiable information (PII) is processed or stored by this server.
  • Rate limits: No throttling was observed in roughly 380 probe requests on 2026-09-20. That says nothing about the published terms: the National Library's SRU and OAI-PMH terms of use have not been checked by this project (see PROBE_REPORT_helveticat.md). Use limit parameters conservatively. The server enforces a 30s timeout per request.
  • Data freshness: Records reflect the upstream source at query time. No caching is performed by this server.
  • Terms of service: Data is subject to the ToS of each source — SIK-ISEA, opendata.swiss, Nationalbibliothek. The opendata.swiss datasets carry open licences (CC0 / CC BY). For the National Library this project has not verified the terms of either endpoint. Where a record carries its own rights statement it is surfaced as rights (MARC 506/540) — many records carry none. The licence line in the attribution footer is the source's general statement, not a per-record one, and JSON responses carry no footer at all. Check with the source before redistributing.
  • No guarantees: This server is a community project, not affiliated with SIK-ISEA, SNM, or NB. Availability depends on upstream APIs.

Known Limitations

  • SIK-ISEA: Artist data is updated periodically; very recent acquisitions may not yet be reflected
  • Nationalmuseum: Only datasets published on opendata.swiss are accessible; not all SNM collections are available
  • Nationalbibliothek: maximumRecords is capped at 50 server-side, silently — a request for more returns 50 without a warning. SRU cannot filter by OAI set, so query and set_spec use different endpoints and cannot be combined into one server-side search. from_date/until_date are the catalogue record's modification dates, not publication years. Measured 2026-09-20; see PROBE_REPORT_helveticat.md.
  • Cross-search: Response time depends on the slowest of the three sources

Testing

bash
# Unit tests (no API key required)PYTHONPATH=src pytest tests/ -m "not live"
# Integration tests (live API calls)pytest tests/ -m "live"
# Lint and format, as CI runs themruff check src/ tests/ scripts/ruff format --check src/ tests/ scripts/

Ruff is pinned to an exact version in pyproject.toml ([project.optional-dependencies] dev), so pip install -e ".[dev]" gives you the version CI uses and the lint gates agree with it. Installing a newer ruff on top changes the rule set and the formatter, and reports differences on code nobody touched. See CONTRIBUTING.md.


MCP Protocol Version

ItemValue
SDKmcp[cli]>=2.0.0,<3 (pinned in pyproject.toml)
Served via the initialize handshake2024-11-05 … 2025-11-25 — the handshake ceiling
Served via the per-request envelope2026-07-28
Who picksThe client's first request, once per connection: a request carrying the 2026-07-28 _meta envelope opens a modern connection, anything else opens a handshake connection. A later claim from the other era is refused.
Update policyThe SDK pin is the source of truth for the protocol version. Dependabot opens monthly mcp update PRs; protocol-version bumps are reviewed there and recorded in CHANGELOG.md.

This server does not override the negotiation — the official mcp SDK decides, and both eras are reachable over either transport (stdio and HTTP alike). Pin the SDK, not a hand-rolled version string, to control which protocol versions are spoken. The numbers above are the pinned SDK's own registry (mcp_types.version: HANDSHAKE_PROTOCOL_VERSIONS, MODERN_PROTOCOL_VERSIONS) — read them there rather than from this table if the pin has moved.

Both revisions are pinned in tests/test_protocol_version.py and asserted against the installed SDK — including the handshake ceiling, measured against a live initialize through the assembled ASGI stack. A Dependabot bump of mcp can no longer move either number without this table going stale unnoticed.

Server identity

FieldValueSource
nameswiss-cultural-heritage-mcp__dist__ — the PyPI name, also in server.json
titleSchweizer Kulturerbeserver.SERVER_TITLE
versionthe shipped package versionpyproject.toml via importlib.metadata
descriptionthe PyPI one-linerpyproject.toml → [project].description
websiteUrlthe project homepagepyproject.toml → [project.urls].Homepage
instructionswhat this server is forserver.INSTRUCTIONS

The identifier is hyphenated, like the repository, the PyPI package and the console script. The Python module keeps underscores — python -m swiss_cultural_heritage_mcp.server above is not an inconsistency, it is the only spelling Python allows for a package name.

The 2026-07-28 era has no handshake. Instead of sending serverInfo once per connection, the SDK stamps the identity into the _meta of every response, and server/discover carries exactly one field beyond the capabilities: instructions.

The SDK supplies none of these on its own — Server.server_info says so outright: "An unversioned server reports an empty version; the SDK never substitutes its own." Until 18 September 2026 this server passed none of them and reported "version": "" on every call. That is now measured in tests/test_server_identity.py, across both eras and through real HTTP requests: a constructor argument that is set is not yet a field on the wire.

Version, description and URL are derived, not written. A literal in the shipped path would be a second truth next to pyproject.toml — the very drift scripts/check_version_sync.py forbids for the version number.


Changelog

See CHANGELOG.md


Contributing

See CONTRIBUTING.md


Security

See SECURITY.md (Deutsch) for the security posture and how to report a vulnerability.


License

MIT License — see LICENSE


Author

Hayal Oezkan · malkreide


Credits & Related Projects

Installation

Run via uv's uvx — no clone or manual install needed. Add to your MCP client config (mcpServers for Claude Desktop, Cursor and Windsurf; use a top-level servers key for VS Code in .vscode/mcp.json):

json
{  "mcpServers": {    "swiss-cultural-heritage-mcp": {      "command": "uvx",      "args": [        "swiss-cultural-heritage-mcp"      ]    }  }}

来源:README.md,提交 18b45ff

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

2
  1. v0.6.0最新Sep 19, 2026
  2. v0.5.0Sep 16, 2026

评分

已满足适用检查项的 50%

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

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分