Connects Claude to three Swiss cultural heritage APIs: SIK-ISEA's SIKART database of 17,000 artists, the Nationalmuseum's collection records, and the Nationalbibliothek's Helveticat bibliography. All three run through opendata.swiss CKAN or OAI-PMH endpoints with no auth required. Exposes search and retrieval tools for each source plus a cross-search that queries all three in parallel. Read-only operations marked with readOnlyHint. Ships with stdio for Claude Desktop and SSE transport for browser deployments. Useful when you need to cross-reference Swiss artists with museum holdings or pull biographical context from primary cultural sources. Part of a broader Swiss public data MCP portfolio covering legal, transport, and statistical datasets.
🇨🇭 Part of the Swiss Public Data MCP Portfolio
MCP Server for Swiss cultural heritage — SIK-ISEA artists, Nationalmuseum collections, and the Nationalbibliothek bibliography
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."
heritage_cross_search — parallel search across all three sources in a single callProject 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.
# 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
# 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 →
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:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsonFor use via claude.ai in the browser (e.g. on managed workstations without local software):
Render.com (recommended):
Frankfurt (EU) — required for Swiss public-sector use under revDSG / EDÖB. See docs/data-residency.md.python -m swiss_cultural_heritage_mcp.server --http --port 8000https://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.
| 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) |
| Tool | Description |
|---|---|
heritage_search_museum_datasets | Search SNM datasets on opendata.swiss |
heritage_browse_collection | Browse objects within a collection via CKAN DataStore |
| 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 |
| Tool | Description |
|---|---|
heritage_cross_search | Parallel search across SIK-ISEA + SNM + NB |
| 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 |
┌─────────────────┐ ┌──────────────────────────────┐ ┌──────────────────────────┐
│ 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) │
└──────────────────────────────┘ └──────────────────────────┘
| 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 |
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.
limit parameters conservatively. The server enforces a 30s timeout per request.# Unit tests (no API key required)
PYTHONPATH=src pytest tests/ -m "not live"
# Integration tests (live API calls)
pytest tests/ -m "live"
| 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.
See CHANGELOG.md
See CONTRIBUTING.md
MIT License — see LICENSE
Hayal Oezkan · malkreide
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"
]
}
}
}