Gives Claude direct access to Switzerland's academic library infrastructure through open protocols. You get 11 tools across four sources: swisscovery (the union catalog covering 500+ libraries and 10M+ records via SRU/MARC21), plus three digitization platforms for historical prints, periodicals, and manuscripts (all via OAI-PMH/Dublin Core). No API keys needed. Search the union catalog with full CQL syntax, harvest records by date range or collection, and parse MARC21 or Dublin Core metadata into structured output. Built on FastMCP with dual transport support. Reach for this when you need to query Swiss academic holdings, track down digitized historical materials, or build research workflows that span physical and digital collections.
🇨🇭 Part of the Swiss Public Data MCP Portfolio
MCP server providing access to Swiss academic libraries — swisscovery, e-rara, e-periodica, e-manuscripta. No API key required.
swiss-academic-libraries-mcp connects AI models to the full Swiss academic library infrastructure via standardised, open protocols. It covers the swisscovery union catalogue (500+ libraries, 10M+ records) and three digitalisation platforms: historical prints (e-rara), periodicals (e-periodica) and manuscripts (e-manuscripta).
All data sources use open, authentication-free protocols (SRU/MARC21, OAI-PMH/Dublin Core). The server supports both local use via Claude Desktop (stdio transport) and cloud deployment (Streamable HTTP).
Anchor demo query: "Which Swiss university dissertations on primary school pedagogy are held in Swiss libraries, and are any of them digitised in e-rara?"
research-workflow and education-research| Source | Protocol | Content | Records |
|---|---|---|---|
| swisscovery (SLSP) | SRU / MARC21 | 500+ Swiss libraries | 10M+ |
| e-rara | OAI-PMH / Dublin Core | Digitised historical prints | 250k+ |
| e-periodica | OAI-PMH / Dublin Core | Digitised periodicals (1750–today) | 1M+ articles |
| e-manuscripta | OAI-PMH / Dublin Core | Manuscripts & archival material | 100k+ |
| Tool | Source | Function |
|---|---|---|
library_info | — | Entry point: overview of all sources and tools |
swisscovery_search | swisscovery | Full-text / CQL search across the union catalogue |
swisscovery_get_record | swisscovery | Single record by MMS-ID |
erara_list_records | e-rara | Prints filtered by date / collection |
erara_get_record | e-rara | Single item by OAI identifier |
erara_list_collections | e-rara | All participating libraries |
eperiodica_list_records | e-periodica | Articles filtered by date |
eperiodica_get_record | e-periodica | Single article by OAI identifier |
emanuscripta_list_records | e-manuscripta | Manuscripts filtered by date / collection |
emanuscripta_get_record | e-manuscripta | Single object by OAI identifier |
emanuscripta_list_collections | e-manuscripta | All archives / collections |
| Query | Tool |
|---|---|
| "Which books about Swiss primary schools are held in Swiss libraries?" | swisscovery_search |
| "Show digitised historical works from ETH Library" | erara_list_records |
| "Which Swiss periodicals were digitised in 2023?" | eperiodica_list_records |
| "What manuscript collections does e-manuscripta hold?" | emanuscripta_list_collections |
Add to claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"swiss-academic-libraries": {
"command": "uvx",
"args": ["swiss-academic-libraries-mcp"]
}
}
}
Restart Claude Desktop — the server starts automatically on first use.
uvx swiss-academic-libraries-mcp --http --port 8000 [--host 127.0.0.1]
Security & Deployment Notes
127.0.0.1 (loopback only). The server has no
built-in authentication.--host 0.0.0.0 only when running behind a reverse proxy that
provides authentication and per-IP rate limits (e.g. nginx with
limit_req + OAuth2-Proxy). Non-loopback bindings emit a WARN log.MCP_LOG_LEVEL=DEBUG|INFO|WARNING.git clone https://github.com/malkreide/swiss-academic-libraries-mcp
cd swiss-academic-libraries-mcp
pip install -e .
Start by calling library_info for a full overview. Then:
"Which books about Swiss primary schools are held in Swiss libraries?"
→ swisscovery_search(query='subject = "Volksschule"', max_records=20)
"Show digitised historical works from ETH Library"
→ erara_list_records(set_spec="zut")
"Which Swiss periodicals were digitised in 2023?"
→ eperiodica_list_records(from_date="2023-01-01", until_date="2023-12-31")
"What manuscript collections does e-manuscripta hold?"
→ emanuscripta_list_collections()
→ [More use cases by audience](EXAMPLES.md) →
💡 "No API key — just install and query."
Full text: Volksschule Zürich
Title: title = "education reform"
Author: creator = "Pestalozzi"
Subject: subject = "pedagogy"
ISBN: isbn = "978-3-05-006234-0"
Combined: title = "school" AND creator = "Pestalozzi"
Pagination: start_record = 11
No API keys or environment variables required.
| Parameter | Default | Description |
|---|---|---|
--http | off | Enable Streamable HTTP transport |
--port | 8000 | Port for HTTP transport |
swiss-academic-libraries-mcp/
├── src/
│ └── swiss_academic_libraries_mcp/
│ ├── __init__.py # Package init
│ ├── server.py # FastMCP server, 11 tools, 2 prompts, 1 resource
│ └── api_client.py # HTTP client, MARC21 + OAI-PMH/DC parsers
├── tests/
│ └── test_server.py # 34 unit tests + 6 live smoke tests
├── pyproject.toml
├── CHANGELOG.md
├── CONTRIBUTING.md # Contributing guide (English)
├── CONTRIBUTING.de.md # Contributing guide (German)
├── SECURITY.md # Security policy (English)
├── SECURITY.de.md # Security policy (German)
├── LICENSE
├── README.md # This file (English)
└── README.de.md # German version
# Unit tests (no network required)
PYTHONPATH=src pytest tests/ -m "not live"
# Live smoke tests (internet required)
PYTHONPATH=src pytest tests/ -m "live"
from_date / until_date and keep max_records reasonable. The server enforces a 30s timeout per request.Contributions are welcome! Please read CONTRIBUTING.md for guidelines on:
This project follows the conventions of the Swiss Public Data MCP Portfolio.
To report a vulnerability, please follow the responsible disclosure process in SECURITY.md. The server is read-only and requires no API key; see the Safety & Limits section above for the security model.
See CHANGELOG.md
If you self-host this server for a Swiss school authority, archive, or municipal use case:
MaxRetentionSec).MIT License — see LICENSE
Hayal Oezkan · github.com/malkreide
| Server | Description |
|---|---|
zurich-opendata-mcp | City of Zurich Open Data |
eth-library-mcp | ETH Library Discovery & Persons API |
swiss-statistics-mcp | Swiss Federal Statistics (BFS) |
fedlex-mcp | Swiss Federal Law via Fedlex SPARQL |
swiss-transport-mcp | OJP journey planning, SIRI-SX disruptions |
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-academic-libraries-mcp": {
"command": "uvx",
"args": [
"swiss-academic-libraries-mcp"
]
}
}
}