Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

Eth Library MCP

by malkreideversion 0.4.0i★ –iRuns on your computer
Registry nameio.github.malkreide/eth-library-mcp

Install

Overview

Description from the maker (original English)

ETH Library Discovery API

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs on your computer
  • Transport: stdio
  • Category: Other

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 1 of 1 passed
  • Runs on your computer with your user’s permissions (files, network, apps).
  • The registry lists no key to fill in.

You need

  • PyPIPython’s uv installed (for the uvx command)

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "eth-library": {
      "command": "uvx",
      "args": [
        "eth-library-mcp"
      ]
    }
  }
}

Run this in your terminal

claude mcp add eth-library -- uvx eth-library-mcp

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "eth-library": {
      "command": "uvx",
      "args": [
        "eth-library-mcp"
      ]
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "eth-library": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "eth-library-mcp"
      ]
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.

Your choice stays on this device in a cookie; no account needed.

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Runs on your computer; the tool list appears in your AI app after you install it.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account malkreide, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • – Not applicable

    Endpoint responds

    This one runs on your computer; there is no internet endpoint

  • – Not applicable

    Sign-in with OAuth

    Runs on your computer and uses local settings instead

  • … Not checked yet

    No hidden instructions in tool descriptions

    Runs on your computer; we can only read tool lists from internet endpoints

Compared with others in Otheri

  • More stars than 0% of the other 18354 servers in this category
  • Published to the registry more recently than 48% of the other 18354 servers in this category
  • Basic checks equal to or better than 100% of the other 18354 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is Eth Library MCP safe?

It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

The registry does not list a required key, though some servers ask you to sign in on first use.

Does it run on my computer or in the cloud?

It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.4.0) reached the registry 2 months ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.

What can I use instead?

In the same category: Spec Driven Development, Remote Desktop Commander, Qemu MCP

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Spec Driven Development

by formulahendry

MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.

Runs on your computer★ 440MITUpdated 14 months ago
Install

Remote Desktop Commander

by desktop-commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

Runs in the cloud★ 211Updated 2 days ago
Install

Qemu MCP

by 0xmortuex

Boot and drive QEMU VMs from an AI agent: keys, screenshots, serial. No guest agent.

Runs on your computerUpdated today
Install

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

🇨🇭 Part of the [Swiss Public Data MCP Portfolio](https://github.com/malkreide)

🏛️ eth-library-mcp

🌐 English | [Deutsch](README.de.md)

MCP server giving AI models direct access to 30M+ resources at ETH Library Zurich – books, maps, images and archival material.

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 and resource-type filtering via the ETH Library's Discovery API – all through a single, standardised MCP interface.

6 Tools · 1 API · 2 Resources · 2 Prompts

MCP Protocol Version: 2026-07-28 (via mcp[cli]>=2.0.0,<3).

BUG-02 is resolved — by removing the tool. eth_search_persons was documented

as "currently non-functional, correct URL to be verified". It has now been verified,

and there is no correct URL: the Persons API is gone from the gateway, not merely

locked. The gateway routes *before* it checks the API key, so an existing route

answers 401 and a missing one answers 404 — /discovery/v1/resources gives 401,

every /persons/v1/* path gives 404, and so does a deliberately invented Discovery

path used as a control. Offering a capability that cannot exist is the same mistake as

returning an empty result, only louder. The measurement is recorded and dated in

tests/fixtures/api_routes.json.

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
  • 📋 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


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 →


Configuration

Environment Variables
VariableDescriptionRequired
ETH_LIBRARY_API_KEYAPI key for the Discovery API✅
ETH_LIBRARY_LOG_LEVELLog level (DEBUG/INFO/WARNING/ERROR), default INFO—
ETH_LIBRARY_CORS_ORIGINSComma-separated CORS allow-origins for --http. Empty by default: no browser client is permitted. * allows any origin and is logged as a warning. Does not affect stdio clients.—
ETH_LIBRARY_ALLOWED_HOSTSComma-separated hostnames this server is reachable under. Required for a non-loopback bind (--host 0.0.0.0): the process cannot derive its own public name, and without this the SDK answers 421 Invalid Host header to every request. Empty by default; loopback stays reachable either way.—
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)
ToolDescription
eth_search_resourcesFull-text search over 30M+ resources with fields, operators, facets
eth_get_resourceFull metadata for a specific resource via MMS-ID
eth_search_archiveSearch within a specific archive (University Archives, Max Frisch, Thomas Mann, etc.)
eth_search_by_typeFilter by resource type (books, maps, images, archival material, etc.)
eth_search_educationCurated search for education topics (pedagogy, school history, etc.)
Utilities
ToolDescription
eth_library_infoServer overview: all types and archives at a glance
Resources & Prompts
ItemTypeDescription
eth://resource-typesResourceAll available resource types
eth://archivesResourceAll available archives and collections
research-workflowPromptStructured research workflow
education-researchPromptEducation topics workflow (Schulamt-optimised)
Query Syntax

The Discovery API uses structured queries:

field,operator,value
FieldMeaning
anyAll fields (recommended for starters)
titleTitle only
creatorAuthor / creator
subSubject headings / topics
OperatorMeaning
containsTerm is present
exactExact match
begins_withStarts 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
IdentifierDescription
ETH_HochschularchivInstitutional memory of ETH Zurich
ETH_MaxFrischArchivEstate of Swiss author Max Frisch
ETH_ThomasMannArchivLetters and documents of Thomas Mann
ETH_GraphischeSammlungPrints, drawings, graphic works
ETH_BildarchivScience/technology history, Swissair (E-Pics)
Example Use Cases
QueryTool
*"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


MCP Protocol Version

This server speaks two protocol eras over the same endpoint. The client's first request on a connection decides which one applies; a later claim from the other era is refused.

EraRevisionWho reaches it
initialize handshake2024-11-05 … `2025-11-25`What today's clients speak. The server answers with the revision asked for, or with the 2025-11-25 ceiling when the request asks for something newer.
Per-request envelope`2026-07-28`A request carrying the 2026-07-28 _meta envelope opens a modern connection.

Both revisions are pinned in tests/test_protocol_version.py and asserted against the installed SDK, so a Dependabot bump of mcp cannot move either one silently. The handshake ceiling is measured against a live initialize through the assembled ASGI stack, not read off a constant name.

Note that the SDK's LATEST_PROTOCOL_VERSION is an alias for the modern era, not for the handshake era — pinning against it alone would leave the era that current clients actually negotiate free to drift.

Update policy. When the gate fails, do not edit the constant blindly: read the spec changelog between the two revisions, verify the server still behaves, then move the constant, this section, README.de.md and CHANGELOG.md together.

Server identity (serverInfo)

2026-07-28 stamps the server's Implementation block into every modern result under _meta.io.modelcontextprotocol/serverInfo (spec #3002) — earlier revisions carried it only in the initialize result. What used to be a one-time field is now repeated on every call, and version is required.

The SDK fills none of it: *"An unversioned server reports an empty version; the SDK never substitutes its own."* Measured against the assembled ASGI stack, this server used to answer "version": "" in both eras while server.json told the registry 0.3.4. It now declares:

FieldValueSource
nameeth-library-mcpthe programmatic identifier — the same string as the distribution name in pyproject.toml, packages[0].identifier in server.json and the suffix of the registry name io.github.malkreide/eth-library-mcp. It used to read eth_library_mcp, the module path: a name under which this server is available nowhere.
titleETH-Bibliothek ZürichSERVER_TITLE in server.py — the only value with no source outside
versionthe installed distribution's versionimportlib.metadata, so it cannot drift from pyproject.toml
descriptionthe distribution summaryimportlib.metadata
websiteUrlthe Homepage project URLimportlib.metadata

icons stays unset: this repository ships none, and an invented path would assert a file that does not exist.

M

Only the beginning is shown; read the rest in the repo

Ask PopNx