swiss-academic-libraries-mcp
This server provides read-only access to Swiss academic library infrastructure, enabling search and retrieval of bibliographic and digitised content β no API key required.
Swisscovery Union Catalogue: Search 10M+ records across 500+ Swiss libraries using full-text or CQL syntax (title, author, subject, ISBN/ISSN); retrieve individual records by MMS-ID with full MARC21-parsed metadata.
e-rara (Historical Prints): List and retrieve 250k+ digitised historical prints, filtered by date range or library/collection. Browse all participating libraries and collections to discover valid filters.
e-periodica (Periodicals): List and retrieve 1M+ digitised Swiss journal articles (1750βpresent), filtered by date range or journal set, with full Dublin Core metadata.
e-manuscripta (Manuscripts): List and retrieve 100k+ digitised manuscripts and archival materials, filtered by date range or archive/collection. Browse all participating archives and collections.
Output flexibility: All tools return results in human-readable Markdown or machine-readable JSON, with pagination via resumption tokens for large result sets.
Built-in Prompts: Includes
research-workflowandeducation-researchprompts for guided queries.Library Info Tool: An entry point overview of all available data sources and tools, requiring no network access.
Provides tools for searching preprints on arXiv across categories (cs, physics, math, stats, etc.) with automatic phrase quoting and request throttling. Returns metadata including arXiv ID, category, date, and linked journal DOI for bridging to full publication and Swiss library holdings.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@swiss-academic-libraries-mcpFind books on Swiss education in swisscovery"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
π¨π Part of the Swiss Public Data MCP Portfolio
π swiss-academic-libraries-mcp
MCP server providing access to Swiss academic libraries β swisscovery, e-rara, e-periodica, e-manuscripta. No API key required.
Demo
Overview
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).
Beyond the catalogue, the server also covers Swiss open-access legal literature β freely readable legal scholarship from sui generis, ex/ante and Repositorium.ch β as metadata (title, authorship, year, licence, DOI, link), never full text.
It also adds the international metadata layer: DOI resolution and international research literature via Crossref, and preprints via arXiv. This lets one conversation answer both "is this held in Switzerland?" (national layer) and "what is this, and where else does it live?" (international layer). Every resolved DOI returns title, ISSN, ISBN and authors as clean top-level fields, so you can pivot straight into swisscovery.
Anchor demo query (national β international): "Find the original publication for this DOI, check whether a preprint version exists, and show whether a Swiss library holds it." β resolve_doi β search_preprints β swisscovery_search(query="<ISSN from resolve_doi>").
Anchor demo query (catalogue): "Which Swiss university dissertations on primary school pedagogy are held in Swiss libraries, and are any of them digitised in e-rara?"
Anchor demo query (OA legal literature): "Which freely accessible legal-scholarship articles exist on data protection in education? Give me title, authorship, year, licence and DOI." β oa_law_search(query="Datenschutz im Bildungsbereich") β results are ranked by relevance: articles matching all terms rank first, articles matching only the core term (Datenschutz) follow, so the query returns the real privacy-law corpus rather than an empty set.
Related MCP server: mcp-openaire
Features
16 tools across 4 catalogue sources + 3 open-access legal-literature sources + 2 international metadata sources β all read-only, no API key required
swisscovery search with full CQL syntax: full-text, title, author, subject, ISBN/ISSN
OAI-PMH harvesting with date range and collection filters plus pagination via resumption tokens
MARC21 parser extracting 20+ fields (title, creator, publication info, subjects, abstract, URLs)
Dublin Core parser for all three digitalisation portals
Dual transport: stdio for Claude Desktop Β· Streamable HTTP for cloud/self-hosted deployments
OA legal-literature search across sui generis, ex/ante and Repositorium.ch with a declarative source registry (new sources = one config entry), best-effort Crossref licence enrichment, and graceful per-source degradation
International metadata layer: DOI resolution and bibliographic search via Crossref (polite pool via
CROSSREF_MAILTO), preprint search via arXiv with automatic phrase quoting and request throttling β clean title/ISSN/ISBN/author fields for pivoting into swisscovery3 built-in prompts:
research-workflow,education-researchanddoi-to-swiss-shelfMarkdown and JSON output for all tools
97 unit/mocked tests (no network) + 30 live smoke tests
Data Sources
Source | Protocol | Content | Records |
SRU / MARC21 | 500+ Swiss libraries | 10M+ | |
OAI-PMH / Dublin Core | Digitised historical prints | 250k+ | |
OAI-PMH / Dublin Core | Digitised periodicals (1750βtoday) | 1M+ articles | |
OAI-PMH / Dublin Core | Manuscripts & archival material | 100k+ |
Open-Access legal literature (metadata only)
Source | Protocol | Content | DOI coverage |
OAI-PMH / Dublin Core | OA legal journal & non-profit publisher | ~100 % ( | |
OAI-PMH / Dublin Core | Peer-reviewed journal for (young) legal scholarship, multilingual | none (persistent URL) | |
Supabase / PostgREST (JSON) | Subject repository for Swiss law | partial |
International metadata layer (metadata only)
Source | Protocol | Content | Licence |
REST / JSON | DOI resolution + international research literature | Metadata CC0 1.0 (public domain) | |
Atom / XML | Preprints (CS, physics, maths, stats, β¦) | Metadata CC0 1.0; preprints per author licence |
Tools
Tool | Source | Function |
| β | Entry point: overview of all sources and tools |
| swisscovery | Full-text / CQL search across the union catalogue |
| swisscovery | Single record by MMS-ID |
| e-rara | Prints filtered by date / collection |
| e-rara | Single item by OAI identifier |
| e-rara | All participating libraries |
| e-periodica | Articles filtered by date |
| e-periodica | Single article by OAI identifier |
| e-manuscripta | Manuscripts filtered by date / collection |
| e-manuscripta | Single object by OAI identifier |
| e-manuscripta | All archives / collections |
| OA legal (all 3) | Search OA legal scholarship (title/abstract/author) with source, language, year and peer-review filters |
| OA legal (all 3) | Single OA legal article by DOI or resolvable URL |
| Crossref | Resolve a DOI to full metadata (title/ISSN/ISBN/authors β pivot into swisscovery) |
| Crossref | Search international research literature; every hit carries a DOI |
| arXiv | Search preprints with automatic phrase quoting; linked journal DOIs bridge to |
Example Use Cases
Query | Tool |
"Which books about Swiss primary schools are held in Swiss libraries?" |
|
"Show digitised historical works from ETH Library" |
|
"Which Swiss periodicals were digitised in 2023?" |
|
"What manuscript collections does e-manuscripta hold?" |
|
"Which OA legal articles exist on facial recognition?" |
|
"Resolve DOI 10.1038/nature14539 and give me its ISSN" |
|
"Find recent preprints on model context protocol" |
|
"Find this paper's DOI, check for a preprint, and see if a Swiss library holds it" |
|
Architecture
Three independent paths share one HTTP client (retry with exponential backoff, shared connection pool, project User-Agent):
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β swiss-academic-libraries-mcp β
β (FastMCP Β· stdio / HTTP) β
ββββββββββ¬ββββββββββββββββ¬βββββββββββββββββ¬βββββββββββββ
β β β
βββ CATALOGUE ββββββ βββ OA-LEGAL β βββ INTERNATIONAL βββ
β (api_client.py) β (oa_legal.py) β (intl_metadata.py)β
β β β β
ββββββββββ΄βββββββββ βββββββββββ΄βββββββββββ βββββ΄βββββββββββββββββββ β
β swisscovery SRU β β source registry β β Crossref REST/JSON β β
β e-rara OAI β β β sui generis OAI β β β resolve_doi β β
β e-periodica OAI β β β ex/ante OAI β β β search_publicationsβ β
β e-manuscripta β β β Repositorium RESTβ β arXiv Atom/XML β β
ββββββββββ¬βββββββββ β harvestβcacheβfilterβ β β search_preprints β β
β β Crossref licence β³ β β (phrase-quote+throttle)β β
MARC21 / Dublin Core βββββββββββ¬βββββββββββ βββββ¬βββββββββββββββββββ β
β catalogue records OaLegalPublication CrossrefWork / Preprint β
(metadata, no full text) (metadata, no full text) βCatalogue path returns bibliographic records (books, digitised prints, periodicals, manuscripts).
OA-legal path harvests OA legal-scholarship metadata once, caches it in memory (small corpus), and filters locally β because OAI-PMH has no keyword search of its own. Adding a fourth OA source is a single registry entry, not new code.
International path resolves DOIs and searches Crossref/arXiv live (Architecture A β the endpoints are small, stable and public, so no dump/cache is needed). Each response carries its own source attribution (Crossref CC0 Β· arXiv acknowledgement), never a pooled one, and returns clean top-level title/ISSN/ISBN/author fields so the model can pivot into the catalogue path. A code-layer egress allow-list restricts outbound calls to
api.crossref.organdexport.arxiv.org.
Licensing & Scope
This server is deliberately conservative about what it emits β a portfolio that treats governance as a feature cannot be careless here.
Metadata, not full text. For OA legal literature the server returns title, authorship, year, licence, DOI/link and β where the source provides it as a metadatum β the abstract. It never ingests, stores, or outputs the article body. The full-text PDF path exposed by Repositorium.ch is intentionally not carried into any field.
licenceis always set. Open Access means free to read, not free to reuse. Licences range from CC0 and CC BY to CC BY-NC-ND, and some articles are simply "free to read" with no open licence at all. When no machine-readable licence is available, the field is"unknown"β never guessed, never omitted. The native OAI metadata of all three sources carries only copyright statements, so"unknown"is the default; a best-effort Crossref lookup upgrades it to the real CC licence where a DOI resolves (e.g. sui generis βCC BY-SA 4.0). Disable withOA_LAW_CROSSREF_ENRICH=0.Citation integrity. Every result carries a resolvable reference β a DOI where present, otherwise a persistent URL. No result is emitted without one. A fabricated citation in legal literature is worse than no citation, so the server prefers one hit fewer over one hit invented.
Language is carried, never silently filtered. ex/ante and Repositorium.ch are multilingual (DE/FR/IT/EN). The
languagefield is always populated, but results are only filtered by language when you explicitly ask β otherwise half the Romandie would vanish from the results.Attribution per source, not pooled. Crossref, arXiv and the OA-legal sources have different licence and citation conditions, so each response carries the attribution of the source it actually came from. Crossref bibliographic metadata is distributed under CC0 1.0 (facts are free); arXiv metadata is CC0 1.0 with the requested acknowledgement "Thank you to arXiv for use of its open access interoperability"; preprint and article full texts remain under their own per-work licences (never emitted here).
Scope boundary. OA legal literature belongs here because it is the same capability already in this server β authentication-free bibliographic-metadata harvesting of Swiss scholarly sources over standard protocols β with the same output contract (metadata, not full text). It is institution-independent and subject-focused, which is why it does not overlap
eth-library-mcp(ETH-institution Discovery & Persons) β the catalogue finds the book, the OA-legal path finds the freely readable article with its licence and DOI.
Known Limitations
Small, focused corpus. The three OA sources together hold on the order of a few hundred articles. Results are ranked by relevance β articles matching all query terms first, then partial matches β so a topical query like "Datenschutz im Bildungsbereich" returns the privacy-law corpus (ranked) rather than nothing; if no article covers the full topic intersection, the closest real matches are returned, never a fabricated one. A query that matches no term at all still returns an honest empty result.
No full-text search. Matching runs over metadata (title, abstract, authorship) only β never the article body.
Uneven DOI coverage. sui generis β 100 %, Repositorium.ch partial, ex/ante has no DOIs (persistent URLs only). Aggregators (Crossref/OpenAlex) therefore cover sui generis well but miss ex/ante entirely and do not index Repositorium.ch as a source β which is why the server harvests each source natively rather than relying on an aggregator.
Licence gaps. The native metadata rarely carries a machine-readable licence;
"unknown"is common and only lifted where a DOI resolves in Crossref.Not a substitute for a paid legal database. This surfaces freely accessible Swiss legal scholarship only β it is not Swisslex/Weblaw and does not cover commercial or paywalled legal publishing.
Known findings β international layer (live probe 2026-07-20)
Finding | Detail | Consequence |
Crossref is weak for German-language CH education literature |
|
|
arXiv treats spaces as OR, not phrase |
|
|
arXiv returns Atom XML, throttles, and 301-redirects | Response is Atom, not JSON; arXiv asks for ~3 s between requests; the plain | Parser reuses |
SHARE (share.osf.io) β evaluated, not built | The | Not implemented. |
Open Library β evaluated, gate failed | A 10-ISBN probe of real Swiss/German-language Lehrmittel (Lehrmittelverlag ZΓΌrich, Klett und Balmer; ISBNs harvested from swisscovery) returned 0/10 = 0 % (threshold 60 %). Controls confirm Open Library works (English + mainstream German trade books resolve), so it is a genuine coverage gap, not a connectivity artefact. | Not implemented. swisscovery already covers CH Lehrmittel; for the book trade, GVI or a publisher directory is the fitting route. |
Prerequisites
Python 3.11 or higher
uv / uvx (recommended) or pip
Internet access (all APIs are publicly available)
Installation
Claude Desktop (recommended)
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.
Cloud / Self-hosted (Streamable HTTP)
uvx swiss-academic-libraries-mcp --http --port 8000 [--host 127.0.0.1]Security & Deployment Notes
Default binding is
127.0.0.1(loopback only). The server has no built-in authentication.Use
--host 0.0.0.0only when running behind a reverse proxy that provides authentication and per-IP rate limits (e.g. nginx withlimit_req+ OAuth2-Proxy). Non-loopback bindings emit a WARN log.Logs go to stderr; set verbosity with
MCP_LOG_LEVEL=DEBUG|INFO|WARNING.
Development
git clone https://github.com/malkreide/swiss-academic-libraries-mcp
cd swiss-academic-libraries-mcp
pip install -e .Quickstart
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."
CQL Search Syntax (swisscovery)
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 = 11Configuration
No API keys required. All environment variables are optional.
Parameter | Default | Description |
| off | Enable Streamable HTTP transport |
| 8000 | Port for HTTP transport |
|
| Log verbosity ( |
|
| OA legal: DOIβlicence enrichment via Crossref; set |
| (public key) | OA legal: override for Repositorium.ch's public read-only Supabase anon key (allows rotation without a code change) |
| (unset) | International: contact e-mail for Crossref's "polite pool" (better throughput). If unset, requests use the anonymous pool β functional, just slower. |
|
| International: minimum spacing between arXiv requests (arXiv asks for restraint). |
Project Structure
swiss-academic-libraries-mcp/
βββ src/
β βββ swiss_academic_libraries_mcp/
β βββ __init__.py # Package init
β βββ server.py # FastMCP server, 16 tools, 3 prompts, 3 resources
β βββ api_client.py # HTTP client (+ retry), MARC21 + OAI-PMH/DC parsers
β βββ oa_legal.py # OA legal-literature registry, adapters, model
β βββ intl_metadata.py # International layer: Crossref + arXiv adapters, models
βββ tests/
β βββ test_server.py # catalogue unit tests + live smoke tests
β βββ test_20_scenarios.py # end-to-end catalogue scenarios
β βββ test_oa_legal.py # OA legal-literature tests (mocked + live)
β βββ test_intl_metadata.py # International-layer tests (mocked + live)
βββ 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 versionTesting
# Unit tests (no network required)
PYTHONPATH=src pytest tests/ -m "not live"
# Live smoke tests (internet required)
PYTHONPATH=src pytest tests/ -m "live"Where the test data comes from
The fixtures under tests/fixtures/ are recorded from the live sources, with
the same request parameters the production code sends, and dated. Source,
retrieval date, selection rule and SHA-256 for every file:
tests/fixtures/PROVENANCE.md.
python scripts/record_fixtures.py # re-recordThis matters because a hand-written mock encodes its author's assumption and can
therefore never refute it β production code and fixture come from the same
reading of the docs. The invented ListSets response carried no
resumptionToken, so no test could notice that nobody followed one: e-rara
serves 105 collections in pages of 10, and the tool reported 10.
Where a fixture is trimmed, the count fields (numberOfRecords,
completeListSize, total-results) and the resumptionToken keep their real
values β they say how much is not in the file.
tests/fixtures/oai_ex_ante_listrecords.xml is deliberately not well-formed
XML: ex/ante emits a raw control character inside a dc:description, and
recording it verbatim is what proves strip_invalid_xml_chars is load-bearing.
Safety & Limits
Read-only: All tools perform HTTP GET requests against public SRU and OAI-PMH endpoints β no data is written, modified, or deleted.
No personal data: The APIs return bibliographic metadata (titles, authors, publication info, subject headings) and public digitisation records. No personally identifiable information (PII) about library users is processed or stored.
Rate limits: swisscovery SRU and the OAI-PMH endpoints are public and have no documented hard limits, but OAI-PMH harvesting is paginated via resumption tokens β use
from_date/until_dateand keepmax_recordsreasonable. The server enforces a 30s timeout per request.Data freshness: Results reflect the upstream catalogues at query time. No caching is performed by this server; indexing latency is controlled by SLSP and the digitisation platforms.
Terms of service: Data is subject to the ToS and licences of each source β swisscovery / SLSP, e-rara, e-periodica, e-manuscripta. Most digitised material is in the public domain or under Creative Commons licences; always check the rights statement on the individual record before redistribution.
No guarantees: This is a community project, not affiliated with SLSP, ETH Library, or any of the participating institutions. Availability depends on the upstream APIs.
Contributing
Contributions are welcome! Please read CONTRIBUTING.md for guidelines on:
Reporting bugs and requesting features
Setting up the development environment
Code style and test requirements
Submitting pull requests
This project follows the conventions of the Swiss Public Data MCP Portfolio.
Security
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.
Changelog
See CHANGELOG.md
Deployment for Swiss Public Administration
If you self-host this server for a Swiss school authority, archive, or municipal use case:
Data residency: prefer on-premise or a CH-based cloud provider. The query patterns themselves (which library searches a civil servant runs) may reveal ongoing research and are best kept on Swiss infrastructure.
Upstream calls go exclusively to CH-hosted services: SLSP / swisscovery, ETH-Bibliothek (e-rara, e-periodica, e-manuscripta). No data leaves Switzerland.
Logging: logs are written to stderr; configure your IT retention policy accordingly (e.g. systemd-journal
MaxRetentionSec).HTTP transport must run behind a reverse proxy with authentication and per-IP rate limits (see Security & Deployment Notes above).
License
MIT License β see LICENSE
Author
Hayal Oezkan Β· github.com/malkreide
Credits & Related Projects
Data (catalogue): swisscovery / SLSP Β· e-rara Β· e-periodica Β· e-manuscripta
Data (OA legal literature): sui generis Β· ex/ante Β· Repositorium.ch β licence enrichment via Crossref. Each source's metadata is used under its own terms; open-access status does not imply an open reuse licence.
Protocol: Model Context Protocol β Anthropic / Linux Foundation
Related: eth-library-mcp β ETH Library Discovery & Persons API
Portfolio: Swiss Public Data MCP Portfolio
Server | Description |
City of Zurich Open Data | |
ETH Library Discovery & Persons API | |
Swiss Federal Statistics (BFS) | |
Swiss Federal Law via Fedlex SPARQL | |
OJP journey planning, SIRI-SX disruptions |
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-academic-libraries-mcp": {
"command": "uvx",
"args": [
"swiss-academic-libraries-mcp"
]
}
}
}Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Flicense-qualityDmaintenanceProvides access to Sweden's National Library (Kungliga biblioteket) open APIs, enabling search and retrieval of 20M+ bibliographic records, 10M+ cultural heritage objects, 2M+ research publications, and linked data through 52 tools across 10 endpoints.1
- Alicense-qualityCmaintenanceEnables AI agents to search and retrieve EU research outputs including publications, datasets, software, and funded projects from OpenAIRE.10MIT
- AlicenseAqualityAmaintenanceEnables AI-native access to Swiss cultural heritage data from SIK-ISEA (artists), Nationalmuseum (collections), and Nationalbibliothek (bibliography) via MCP tools, without authentication.11MIT
- Alicense-qualityDmaintenanceConnects AI assistants to the Swiss I14Y Interoperability Platform, enabling natural language exploration of government datasets, APIs, codelists, and public services.MIT
Related MCP Connectors
Federated search of books and papers, BibTeX/RIS citations, open-access retrieval and reading.
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Scholarly search: OpenAlex, Crossref, arXiv, OpenCitations and PubMed in one endpoint.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/malkreide/swiss-academic-libraries-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server