π¨π Part of the Swiss Public Data MCP Portfolio
ποΈ swiss-cultural-heritage-mcp
MCP Server for Swiss cultural heritage β SIK-ISEA artists, Nationalmuseum collections, and the Nationalbibliothek bibliography
Overview
swiss-cultural-heritage-mcp provides AI-native access to three major Swiss cultural heritage data sources, all without authentication:
| Source | Data | API |
|---|---|---|
| SIK-ISEA (SIKART) | ~17,000 Swiss artists β SIKART biographical data | opendata.swiss CKAN |
| Nationalmuseum (SNM) | Museum collections (numismatics, seals, special collections) | opendata.swiss CKAN |
| Nationalbibliothek (NB) | Swiss national bibliography (Helveticat) | OAI-PMH |
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.
Anchor demo query: "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."
Demo
Features
- ποΈ 8 tools, 2 resources, 2 prompts across three data sources
- π
heritage_cross_searchβ parallel search across all three sources in a single call - π 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
# Clone the repository
git clone https://github.com/malkreide/swiss-cultural-heritage-mcp.git
cd swiss-cultural-heritage-mcp
# Install
pip install -e .
# or with uv:
uv pip install -e .
Or with uvx (no permanent installation):
uvx swiss-cultural-heritage-mcp
Quickstart
# 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):
{
"mcpServers": {
"swiss-cultural-heritage": {
"command": "python",
"args": ["-m", "swiss_cultural_heritage_mcp.server"]
}
}
}
Or with uvx:
{
"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):
- Push/fork the repository to GitHub
- On render.com: New Web Service β connect GitHub repo
- Select region
Frankfurt(EU) β required for Swiss public-sector use under revDSG / EDΓB. Seedocs/data-residency.md. - Set start command:
python -m swiss_cultural_heritage_mcp.server --http --port 8000 - 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)
| Tool | Description |
|---|---|
heritage_search_artists | Search ~17,000 Swiss artists (SIKART) by name or place |
heritage_get_artist | Full artist profile by SIKART ID (HAUPTNR) |
Nationalmuseum (SNM)
| Tool | Description |
|---|---|
heritage_search_museum_datasets | Search SNM datasets on opendata.swiss |
heritage_browse_collection | Browse objects within a collection via CKAN DataStore |
Nationalbibliothek (NB)
| Tool | Description |
|---|---|
heritage_search_helveticat | Search Swiss national bibliography via OAI-PMH |
heritage_list_nb_collections | List available OAI-PMH sets |
heritage_get_publication | Full Dublin Core metadata for a publication |
Cross-Source
| Tool | Description |
|---|---|
heritage_cross_search | Parallel search across SIK-ISEA + SNM + NB |
Example Use Cases
| Query | Tool |
|---|---|
| "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 |
Architecture
βββββββββββββββββββ ββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ
β Claude / AI ββββββΆβ Swiss Cultural Heritage MCP ββββββΆβ SIK-ISEA β
β (MCP Host) βββββββ (MCP Server) βββββββ opendata.swiss / CKAN β
βββββββββββββββββββ β β ββββββββββββββββββββββββββββ€
β 9 Tools Β· 2 Resources ββββββΆβ Nationalmuseum (SNM) β
β 2 Prompts βββββββ opendata.swiss / CKAN β
β Stdio | SSE β ββββββββββββββββββββββββββββ€
β ββββββΆβ Nationalbibliothek (NB) β
β No authentication required βββββββ OAI-PMH (Helveticat) β
ββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ
Data Source Characteristics
| Source | Protocol | Coverage | Auth |
|---|---|---|---|
| SIK-ISEA (SIKART) | CKAN DataStore | ~17,000 Swiss artists | None |
| Nationalmuseum | CKAN DataStore | Museum collections | None |
| Nationalbibliothek | OAI-PMH | Swiss national bibliography | None |
Project Structure
swiss-cultural-heritage-mcp/
βββ src/swiss_cultural_heritage_mcp/
β βββ __init__.py # Package
β βββ server.py # 8 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 8 tools live in one
server.pyrather than atools/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: The opendata.swiss and OAI-PMH endpoints are not rate-limit-documented; use
limitparameters 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 OAI-PMH. All data is published under open licenses (CC0 / CC BY).
- 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: OAI-PMH harvesting is rate-limited; large result sets require pagination
- Cross-search: Response time depends on the slowest of the three sources
Testing
# Unit tests (no API key required)
PYTHONPATH=src pytest tests/ -m "not live"
# Integration tests (live API calls)
pytest tests/ -m "live"
MCP Protocol Version
| Item | Value |
|---|---|
| Supported MCP protocol version | 2025-11-25 (negotiated by the SDK) |
| SDK | mcp[cli] >=1.0.0,<2.0.0 (pinned in pyproject.toml) |
| Update policy | The 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. |
The official mcp SDK negotiates the protocol version during initialize; this server does not override it. Pin the SDK (not a hand-rolled version string) to control which protocol version is spoken.
Changelog
See CHANGELOG.md
Contributing
See CONTRIBUTING.md
License
MIT License β see LICENSE
Author
Hayal Oezkan Β· malkreide
Credits & Related Projects
- SIK-ISEA: www.sik-isea.ch β Swiss Institute for Art Research
- Nationalmuseum: www.nationalmuseum.ch / opendata.swiss
- Nationalbibliothek: www.nb.admin.ch β Swiss National Library
- Protocol: Model Context Protocol β Anthropic / Linux Foundation
- Related: eth-library-mcp β ETH Library: full Swiss library coverage (ETH = science, NB = humanities)
- Related: fedlex-mcp β Cultural heritage law + primary legislation
- Related: zurich-opendata-mcp β Spatial-historical: museum objects + Zurich geodata
- Portfolio: Swiss Public Data MCP Portfolio
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):
{
"mcpServers": {
"swiss-cultural-heritage-mcp": {
"command": "uvx",
"args": [
"swiss-cultural-heritage-mcp"
]
}
}
}