Install
$ agentstack add mcp-malkreide-eth-library-mcp ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
> 🇨🇭 Part of the Swiss Public Data MCP Portfolio
🏛️ eth-library-mcp
[](https://opensource.org/licenses/MIT) [](https://www.python.org/downloads/) [](https://modelcontextprotocol.io/) [](https://developer.library.ethz.ch) [](https://github.com/malkreide/eth-library-mcp/actions/workflows/ci.yml)
🌐 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
Overview
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, ⚠️ **Known issue (BUG-02):** The tool ethsearchpersons` 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."
Features
- 🔍 Full-text search over 30M+ resources with fields, operators, and facets
- 📖 Resource details – full metadata via MMS-ID
- 🗂️ Archive search – ETH University Archives, Max Frisch, Thomas Mann, Graphische Sammlung, Bildarchiv
- 🏷️ Resource type filter – books, maps, images, archival material and more
- 🎓 Education search – curated workflow optimised for pedagogy and school history
- 👤 Person search with linked-data enrichment (Wikidata, GND, Metagrid) (BUG-02: currently unavailable)
- 📋 Server overview – all resource types and archives at a glance
- 🗣️ Built-in prompts – structured research and education-research workflows
- ☁️ Dual transport – stdio for Claude Desktop, Streamable HTTP/SSE for cloud deployment
Prerequisites
- Python 3.11+
- A free API key from developer.library.ethz.ch
Installation
# 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 .
Quickstart
# 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.server
> Without 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 →](EXAMPLES.md)
Configuration
Environment Variables
| Variable | Description | Required | |---|---|---| | ETH_LIBRARY_API_KEY | API key for Discovery & Persons API | ✅ |
Claude Desktop Configuration
{
"mcpServers": {
"eth-library": {
"command": "python",
"args": ["-m", "eth_library_mcp.server"],
"env": {
"ETH_LIBRARY_API_KEY": "your_key_here"
}
}
}
}
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):
python -m eth_library_mcp.server --http --port 8000
The 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."
Available Tools
Discovery API (api.library.ethz.ch)
| 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.) |
Persons API
| Tool | Description | |---|---| | eth_search_persons | Person search with linked-data enrichment (Wikidata, GND, Metagrid) — ⚠️ BUG-02 |
Utilities
| Tool | Description | |---|---| | eth_library_info | Server overview: all types and archives at a glance |
Resources & Prompts
| 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) |
Query Syntax
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
Available Archives
| 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) |
Example Use Cases
| 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 |
Project Structure
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
Testing
# 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"
Safety & Limits
- Read-only: All tools perform HTTP GET requests only — no data is written, modified, or deleted.
- No personal data: The APIs return bibliographic metadata (titles, authors, subjects, identifiers). No personally identifiable information (PII) is processed or stored by this server.
- Authentication: A free API key from developer.library.ethz.ch is required. The key is read from the
ETH_LIBRARY_API_KEYenvironment variable and never logged or transmitted to third parties. - Rate limits: The ETH Library API enforces rate limits per API key. The server enforces a 30-second timeout per request. Use
limitandoffsetparameters conservatively. - Data freshness: Results reflect the ETH Library catalogue at query time. No caching is performed by this server.
- Terms of service: Bibliographic metadata is published as Public Domain — free for all uses. API access is subject to the ETH Library Developer Portal terms.
- Known issue (BUG-02):
eth_search_personsreturns HTTP 404 — the Persons API endpoint URL needs verification. All other 6 tools work correctly. - No guarantees: This is a community project, not affiliated with the ETH Library or ETH Zurich. Availability depends on upstream APIs.
Contributing
Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) ([Deutsch](CONTRIBUTING.de.md)) for guidelines.
Security
Read-only, no PII, a single upstream API key, and a fixed egress allow-list of ETH Library endpoints. See [SECURITY.md](SECURITY.md) ([Deutsch](SECURITY.de.md)) for the full security posture and accepted-risk decisions.
Changelog
See [CHANGELOG.md](CHANGELOG.md)
License
- Server code: MIT License — see [LICENSE](LICENSE)
- Bibliographic metadata: Public Domain (no restrictions)
- API documentation: developer.library.ethz.ch
Powered by Model Context Protocol • 2 APIs • 7 Tools • 2 Resources • 2 Prompts
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": {
"eth-library-mcp": {
"command": "uvx",
"args": [
"eth-library-mcp"
]
}
}
}
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: malkreide
- Source: malkreide/eth-library-mcp
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.