Eth Library Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Eth Library Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
🇨🇭 Part of the [Swiss Public Data MCP Portfolio](https://github.com/malkreide)
🌐 English | [Deutsch](README.de.md)
MCP server giving AI models direct access to 30M+ resources at ETH Library Zurich – books, maps, images, archival material, and linked-data person records.
Demo: Claude using eth_search_archive to find historical school documents
eth-library-mcp connects AI assistants like Claude to the largest natural-science library in Switzerland. It exposes full-text search, archive-level queries, resource-type filtering, and person lookups via the ETH Library's Discovery and Persons APIs – all through a single, standardised MCP interface.
7 Tools · 3 APIs · 2 Resources · 2 Prompts
MCP Protocol Version: 2025-06-18 (via mcp[cli]>=1.0.0,<2.0.0).
⚠️ Known issue (BUG-02): The tool eth_search_persons is currently non-functional because the Persons API endpoint returns HTTP 404. The correct URL needs to be verified at developer.library.ethz.ch. All other 6 tools work correctly.Anchor demo query: "Find historical documents about Zurich school history in the ETH Library archives."
# Clone the repository
git clone https://github.com/malkreide/eth-library-mcp.git
cd eth-library-mcp
# Install
pip install -e .
# Or with uv (recommended)
uv pip install -e .# Set the API key
export ETH_LIBRARY_API_KEY=your_key_here # macOS / Linux
# $env:ETH_LIBRARY_API_KEY = "your_key_here" # Windows (PowerShell)
# Start the server (stdio mode for Claude Desktop)
python -m eth_library_mcp.serverWithout an API key the server returns a helpful error message with the registration link – no crashes.
Try it immediately in Claude Desktop:
"Find books about Swiss education history in the ETH Library." "Search the Max Frisch archive for manuscripts about Zurich."
→ More use cases by audience →
| Variable | Description | Required |
|---|---|---|
ETH_LIBRARY_API_KEY | API key for Discovery & Persons API | ✅ |
{
"mcpServers": {
"eth-library": {
"command": "python",
"args": ["-m", "eth_library_mcp.server"],
"env": {
"ETH_LIBRARY_API_KEY": "your_key_here"
}
}
}
}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):
python -m eth_library_mcp.server --http --port 8000The HTTP transport binds to 127.0.0.1 by default. To expose it on another interface, pass --host explicitly:
# Only behind a reverse-proxy / firewall that terminates TLS and enforces auth.
python -m eth_library_mcp.server --http --host 0.0.0.0 --port 8000⚠️ Do not bind to `0.0.0.0` without a reverse proxy. The server has no built-in auth, rate-limiting or TLS — any LAN neighbour could call your tools.
💡 "stdio for the developer laptop, HTTP for the browser — behind a proxy."
| Tool | Description |
|---|---|
eth_search_resources | Full-text search over 30M+ resources with fields, operators, facets |
eth_get_resource | Full metadata for a specific resource via MMS-ID |
eth_search_archive | Search within a specific archive (University Archives, Max Frisch, Thomas Mann, etc.) |
eth_search_by_type | Filter by resource type (books, maps, images, archival material, etc.) |
eth_search_education | Curated search for education topics (pedagogy, school history, etc.) |
| Tool | Description |
|---|---|
eth_search_persons | Person search with linked-data enrichment (Wikidata, GND, Metagrid) — ⚠️ BUG-02 |
| Tool | Description |
|---|---|
eth_library_info | Server overview: all types and archives at a glance |
| Item | Type | Description |
|---|---|---|
eth://resource-types | Resource | All available resource types |
eth://archives | Resource | All available archives and collections |
research-workflow | Prompt | Structured research workflow |
education-research | Prompt | Education topics workflow (Schulamt-optimised) |
The Discovery API uses structured queries:
field,operator,value| Field | Meaning |
|---|---|
any | All fields (recommended for starters) |
title | Title only |
creator | Author / creator |
sub | Subject headings / topics |
| Operator | Meaning |
|---|---|
contains | Term is present |
exact | Exact match |
begins_with | Starts with |
Examples:
any,contains,Volksschule Zürich
title,contains,Pädagogik
creator,exact,Einstein Albert
sub,contains,Bildungsforschung
title,contains,Schule;sub,contains,Geschichte| Identifier | Description |
|---|---|
ETH_Hochschularchiv | Institutional memory of ETH Zurich |
ETH_MaxFrischArchiv | Estate of Swiss author Max Frisch |
ETH_ThomasMannArchiv | Letters and documents of Thomas Mann |
ETH_GraphischeSammlung | Prints, drawings, graphic works |
ETH_Bildarchiv | Science/technology history, Swissair (E-Pics) |
| Query | Tool |
|---|---|
| "Find books about Zurich school history" | eth_search_education |
| "What's in the Max Frisch archive?" | eth_search_archive |
| "Find historical maps of Switzerland" | eth_search_by_type |
| "Get full metadata for resource ID 991170525863705501" | eth_get_resource |
| "Which archives does the ETH Library hold?" | eth_library_info |
eth-library-mcp/
├── src/
│ └── eth_library_mcp/
│ ├── __init__.py # Package init, version
│ └── server.py # FastMCP server, all tools
├── tests/
│ └── test_server.py # Unit tests
├── CHANGELOG.md
├── CONTRIBUTING.md # Contribution guide (English)
├── CONTRIBUTING.de.md # Contribution guide (German)
├── SECURITY.md # Security posture (English)
├── SECURITY.de.md # Security posture (German)
├── LICENSE
├── README.md # This file (English)
├── README.de.md # German version
├── claude_desktop_config.json # Example Claude Desktop configuration
└── pyproject.toml # Build configuration# Unit tests (no API key required)
PYTHONPATH=src pytest tests/ -m "not live"
# Integration tests (API key required)
ETH_LIBRARY_API_KEY=xxx pytest tests/ -m "live"ETH_LIBRARY_API_KEY environment variable and never logged or transmitted to third parties.limit and offset parameters conservatively.eth_search_persons returns HTTP 404 — the Persons API endpoint URL needs verification. All other 6 tools work correctly.Contributions are welcome! See CONTRIBUTING.md (Deutsch) for guidelines.
Read-only, no PII, a single upstream API key, and a fixed egress allow-list of ETH Library endpoints. See SECURITY.md (Deutsch) for the full security posture and accepted-risk decisions.
See CHANGELOG.md
Powered by [Model Context Protocol](https://modelcontextprotocol.io/) • 2 APIs • 7 Tools • 2 Resources • 2 Prompts
<!-- mcp-name: io.github.malkreide/eth-library-mcp -->
<!-- BEGIN GENERATED: install -->
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": {
"eth-library-mcp": {
"command": "uvx",
"args": [
"eth-library-mcp"
]
}
}
}<!-- END GENERATED: install -->
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.