mcpField
S
swiss-academic-libraries-mcp

swiss-academic-libraries-mcp

本地服务
github.com搜索与检索15 周前更新

关于 swiss-academic-libraries-mcp

面向学术研究的 MCP 服务,可搜索瑞士图书馆目录、数字化馆藏、开放获取法律文献及国际研究元数据。它通过开放协议汇集多类来源,并仅提供书目元数据,不返回论文全文。

主要功能

  1. 01搜索 swisscovery 联合目录
  2. 02浏览数字化古籍、期刊和手稿
  3. 03搜索瑞士开放获取法律文献
  4. 04解析 DOI 并搜索 Crossref 和 arXiv
  5. 05筛选记录并获取元数据
  6. 06支持 stdio 和 Streamable HTTP 传输

适用场景

  1. 01确认瑞士图书馆是否收藏某出版物
  2. 02查找数字化历史资料或手稿
  3. 03搜索法律文献并查看许可信息
  4. 04追踪 DOI、预印本及瑞士馆藏

MCP 相关

向 MCP 客户端提供只读目录与元数据搜索工具、资源和内置提示词。支持 stdio 与 Streamable HTTP 传输。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"malkreide-swiss-academic-libraries": {
"command": "uvx",
"args": [
"swiss-academic-libraries-mcp"
]
}
}
}
启动命令uvx swiss-academic-libraries-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiswiss-academic-libraries-mcp1.3.0

工具

16

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

🇨🇭 属于 Swiss Public Data MCP Portfolio

📚 swiss-academic-libraries-mcp

PyPI version License: MIT Python 3.11+ MCP No Auth Required CI

提供瑞士学术图书馆访问能力的 MCP 服务,涵盖 swisscovery、e-rara、e-periodica 和 e-manuscripta。无需 API 密钥。

🇩🇪 德语版本

演示

演示:Claude 使用 swisscovery_search 和 erara_list_records


概述

swiss-academic-libraries-mcp 通过标准化开放协议,将 AI 模型连接到完整的瑞士学术图书馆基础设施。它涵盖 swisscovery 联合目录(500 多家图书馆、1,000 多万条记录)和三个数字化平台:历史印刷品(e-rara)、期刊(e-periodica)和手稿(e-manuscripta)。

所有数据源均使用开放且无需身份验证的协议(SRU/MARC21、OAI-PMH/Dublin Core)。该服务支持通过 Claude Desktop 在本地使用(stdio 传输),也支持部署到云端(Streamable HTTP)。

除了目录之外,该服务还涵盖瑞士开放获取法律文献——来自 sui generis、ex/ante 和 Repositorium.ch 的可免费阅读法律学术成果——仅提供元数据(标题、作者、年份、许可、DOI、链接),绝不提供全文。

它还加入了国际元数据层:通过 Crossref 解析 DOI 并检索国际研究文献,以及通过 arXiv 检索预印本。这样,只需一次对话即可回答 “这份文献是否收藏于瑞士?”(国家层)以及 “这是什么文献?其他地方又有哪些?”(国际层)。每个已解析的 DOI 都会返回标题、ISSN、ISBN 和作者作为清晰的顶层字段,方便你直接在 swisscovery 中继续检索。

重点演示查询(国家层 ↔ 国际层): “查找该 DOI 对应的原始出版物,检查是否存在预印本版本,并确认瑞士图书馆是否收藏了它。” → resolve_doi → search_preprints → swisscovery_search(query="<ISSN from resolve_doi>")。

重点演示查询(目录): “瑞士图书馆收藏了哪些有关小学教育学的瑞士大学学位论文?其中是否有在 e-rara 上数字化的?”

重点演示查询(开放获取法律文献): “有哪些可免费访问的法律学术文章讨论教育领域的数据保护?请提供标题、作者、年份、许可和 DOI。” → oa_law_search(query="Datenschutz im Bildungsbereich") — 结果按相关性排序:匹配所有词项的文章排在最前面,仅匹配核心词项(Datenschutz)的文章随后,因此查询会返回真实的数据隐私法律文献,而不是空结果。


功能

  • 16 个工具,涵盖 4 个目录来源、3 个开放获取法律文献来源和 2 个国际元数据来源——均为只读,无需 API 密钥
  • swisscovery 搜索,支持完整的 CQL 语法:全文、标题、作者、主题、ISBN/ISSN
  • OAI-PMH 收割,支持日期范围和馆藏筛选,并通过恢复令牌分页
  • MARC21 解析器,可提取 20 多个字段(标题、创作者、出版信息、主题、摘要、URL)
  • Dublin Core 解析器,适用于全部三个数字化门户
  • 双传输方式:面向 Claude Desktop 的 stdio · 面向云端/可自托管部署的 Streamable HTTP
  • 开放获取法律文献搜索,覆盖 sui generis、ex/ante 和 Repositorium.ch,采用声明式来源注册表(新增来源只需一条配置),尽力通过 Crossref 补充许可信息,并能在单个来源不可用时优雅降级
  • 国际元数据层:通过 Crossref 解析 DOI 并搜索书目(使用 CROSSREF_MAILTO 接入礼貌池);通过 arXiv 搜索预印本,自动为短语加引号并限制请求频率——提供整洁的标题/ISSN/ISBN/作者字段,便于转到 swisscovery 继续检索
  • 3 个内置提示词:research-workflow、education-research 和 doi-to-swiss-shelf
  • 所有工具均支持 Markdown 和 JSON 输出
  • 97 项单元测试/模拟测试(无需联网)+ 30 项实时冒烟测试

数据来源

来源协议内容记录数
swisscovery (SLSP)SRU / MARC21500 多家瑞士图书馆1000 万以上
e-raraOAI-PMH / Dublin Core数字化历史印刷品25 万以上
e-periodicaOAI-PMH / Dublin Core数字化期刊(1750 年至今)100 多万篇文章
e-manuscriptaOAI-PMH / Dublin Core手稿和档案资料10 万以上
开放获取法律文献(仅元数据)
来源协议内容DOI 覆盖率
sui generisOAI-PMH / Dublin Core开放获取法律期刊和非营利出版商约 100 %(10.21257/…)
ex/anteOAI-PMH / Dublin Core同行评审期刊,刊载(青年)法律学术研究,多语言无(持久 URL)
Repositorium.chSupabase / PostgREST (JSON)瑞士法律学科知识库部分
国际元数据层(仅元数据)
来源协议内容许可
CrossrefREST / JSONDOI 解析 + 国际研究文献元数据采用 CC0 1.0(公有领域)
arXivAtom / XML预印本(计算机科学、物理、数学、统计学等)元数据采用 CC0 1.0;预印本遵循作者许可

工具

工具来源功能
library_info—入口:所有来源和工具的概览
swisscovery_searchswisscovery在联合目录中进行全文/CQL 搜索
swisscovery_get_recordswisscovery根据 MMS-ID 获取单条记录
erara_list_recordse-rara按日期/馆藏筛选并列出印刷品
erara_get_recorde-rara根据 OAI 标识符获取单件藏品
erara_list_collectionse-rara所有参与的图书馆
eperiodica_list_recordse-periodica按日期筛选文章
eperiodica_get_recorde-periodica根据 OAI 标识符获取单篇文章
emanuscripta_list_recordse-manuscripta按日期/馆藏筛选手稿
emanuscripta_get_recorde-manuscripta根据 OAI 标识符获取单件对象
emanuscripta_list_collectionse-manuscripta所有档案馆/馆藏
oa_law_searchOA legal (all 3)搜索 OA 法律学术成果(标题/摘要/作者),并按来源、语言、年份和同行评审情况筛选
oa_law_getOA legal (all 3)根据 DOI 或可解析的 URL 获取单篇 OA 法律文章
resolve_doiCrossref将 DOI 解析为完整元数据(标题/ISSN/ISBN/作者 → 转入 swisscovery)
search_publicationsCrossref搜索国际研究文献;每条结果都包含 DOI
search_preprintsarXiv搜索预印本并自动为短语加引号;关联期刊 DOI 可跳转到 resolve_doi
使用示例
查询工具
“瑞士图书馆收藏了哪些有关瑞士小学的书籍?”swisscovery_search
“展示 ETH Library 的数字化历史作品”erara_list_records
“2023 年数字化了哪些瑞士期刊?”eperiodica_list_records
“e-manuscripta 收藏了哪些手稿?”emanuscripta_list_collections
“有哪些关于人脸识别的 OA 法律文章?”oa_law_search
“解析 DOI 10.1038/nature14539 并提供其 ISSN”resolve_doi
“查找近期关于模型上下文协议的预印本”search_preprints
“查找这篇论文的 DOI,检查是否有预印本,并确认瑞士图书馆是否收藏了它”resolve_doi → search_preprints → swisscovery_search

架构

三条独立路径共用一个 HTTP 客户端(采用指数退避重试、共享连接池,并设置项目的 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) │
  • 目录路径返回书目记录(书籍、数字化印刷品、期刊、手稿)。
  • OA 法律路径一次性采集 OA 法律学术成果元数据,将其缓存在内存中(语料规模较小),并在本地进行筛选——因为 OAI-PMH 本身不支持关键词搜索。添加第四个 OA 来源只需登记一条注册项,无需编写新代码。
  • 国际路径实时解析 DOI 并搜索 Crossref/arXiv(架构 A——这些端点规模小、稳定且公开,因此无需转储/缓存)。每条响应都带有自身的来源标注(Crossref CC0 · arXiv 致谢),绝不使用汇总后的来源标注;响应还会返回整洁的顶层标题/ISSN/ISBN/作者字段,供模型转入目录路径。代码层的出口允许列表将外发调用限制为 api.crossref.org 和 export.arxiv.org。

许可与范围

本服务在输出内容方面刻意采取保守策略——对于将治理视为一项功能的作品集,在这方面不能掉以轻心。

  • 元数据,而非全文。 对于开放获取的法律文献,本服务返回标题、作者、年份、许可、DOI/链接,以及——在来源将摘要作为元数据提供时——摘要。它绝不摄取、存储或输出文章正文。Repositorium.ch 提供的全文 PDF 路径有意不纳入任何字段。
  • 始终设置 licence。 开放获取意味着免费阅读,而非可免费再利用。许可范围从 CC0、CC BY 到 CC BY-NC-ND;有些文章只是“免费阅读”,完全没有开放许可。若没有机器可读的许可信息,该字段将设为 "unknown"——绝不猜测,也绝不省略。三个来源的原生 OAI 元数据都只包含版权声明,因此默认值为 "unknown";尽力进行的 Crossref 查询会在 DOI 可解析时将其更新为实际的 CC 许可(例如,sui generis → CC BY-SA 4.0)。使用 OA_LAW_CROSSREF_ENRICH=0 可禁用此功能。
  • 引文完整性。 每条结果都包含可解析的引用——有 DOI 时使用 DOI,否则使用持久 URL。没有引用的结果不会输出。在法律文献中,捏造引用比没有引用更糟糕,因此本服务宁可少提供一条结果,也不编造一条引用。
  • 保留语言信息,绝不静默过滤。 ex/ante 和 Repositorium.ch 支持多种语言(DE/FR/IT/EN)。language 字段始终会填充,但只有在你明确要求时才会按语言筛选结果——否则,Romandie 的半数内容都会从结果中消失。
  • 按来源标注,而非合并标注。 Crossref、arXiv 和 OA 法律文献来源的许可与引用条件各不相同,因此每个响应都会标注其实际来源。Crossref 书目元数据以 CC0 1.0 许可发布(事实可自由使用);arXiv 元数据采用 CC0 1.0,并附带所请求的致谢 "Thank you to arXiv for use of its open access interoperability";预印本和文章全文仍受各自作品的许可约束(此处绝不输出)。
  • 范围边界。 OA 法律文献适合纳入此处,因为它与本服务已有的能力相同——通过标准协议免认证采集瑞士学术来源的书目元数据——并遵循相同的输出约定(元数据,而非全文)。它不依赖特定机构且聚焦特定主题,因此与 eth-library-mcp(ETH 机构的 Discovery & Persons)不重叠——目录用于查找书籍,OA 法律文献路径则用于查找可免费阅读、附有许可和 DOI 的文章。

已知局限

  • 语料规模小且范围集中。 三个 OA 来源合计约有数百篇文章。结果按相关性排序——先显示匹配所有查询词的文章,再显示部分匹配的文章——因此,像 “Datenschutz im Bildungsbereich” 这样的主题查询会返回隐私法语料(按相关性排序),而不是空结果;如果没有文章涵盖所有主题交集,则返回最接近的真实匹配项,绝不捏造结果。完全没有匹配任何词的查询仍会如实返回空结果。
  • 不支持全文搜索。 仅匹配元数据(标题、摘要、作者信息),不会搜索文章正文。
  • DOI 覆盖不均。 sui generis ≈ 100 %,Repositorium.ch 部分覆盖,ex/ante 没有 DOI(仅有持久 URL)。因此,聚合器(Crossref/OpenAlex)对 sui generis 的覆盖较好,但完全遗漏 ex/ante,也不将 Repositorium.ch 作为来源编入索引——这就是服务从每个来源原生采集数据,而不依赖聚合器的原因。
  • 许可信息缺失。 原生元数据很少包含机器可读的许可信息;"unknown" 很常见,只有在 DOI 可通过 Crossref 解析时才会补充。
  • 不能替代付费法律数据库。 这里只收录可免费访问的瑞士法律学术成果;它不是 Swisslex/Weblaw,也不涵盖商业或付费墙后的法律出版物。
已知发现 — 国际层(2026-07-20 实时探测)
发现详情影响
Crossref 对德语瑞士教育文献的支持较弱query.bibliographic=Lehrplan 21 返回的首条结果是 1881 年的一篇书籍章节;其他瑞士教育查询会产生数百万条无关结果,首条结果也偏题或年代久远。Crossref 擅长 DOI 解析和国际研究,而非瑞士教育出版物。search_publications 对此作了说明,并建议瑞士教育主题使用 swisscovery_search / oa_law_search。
arXiv 将空格视为 OR,而非短语all:model context protocol → 约 1,296,686 条结果(OR);all:"model context protocol" → 462 条结果(短语)。search_preprints 会自动为查询加引号;用户无需了解 arXiv 语法。字段语法(ti:、au:)和显式引号仍会被保留。
arXiv 返回 Atom XML,会限流,并将 http 重定向到 https(301)响应为 Atom,而非 JSON;arXiv 要求请求间隔约 3 秒;纯 http:// 端点会重定向(301)。解析器复用 defusedxml(已是依赖,无需新增依赖);模块级限流(ARXIV_MIN_INTERVAL_SECONDS,默认值为 3 秒)确保请求间隔;客户端直接调用 https:// 端点。
SHARE(share.osf.io)——已评估,未构建_search 端点可以响应(约 5,890 万条记录,采用 Elasticsearch 风格),但 SHARE 已于 2020 年停止采集,将数据库存档至 CurateND,且不承诺维护 API(“正在关闭 / 进入新阶段”,现为“trove” search-api)。对于强调可靠性的项目组合而言,依赖一个没有支持保证的索引并不理想。未实现。
Open Library——已评估,未通过门槛对真实瑞士/德语 Lehrmittel 进行的 10 个 ISBN 探测(Lehrmittelverlag Zürich、Klett und Balmer;ISBN 来源于 swisscovery)结果为 0/10 = 0 %(门槛为 60 %)。对照测试确认 Open Library 可正常运行(英文及主流德语贸易图书均可解析),因此这是实际的覆盖缺口,而非连接问题。未实现。 swisscovery 已覆盖瑞士 Lehrmittel;对于图书贸易,GVI 或出版商目录才是合适的途径。

前置要求

  • Python 3.11 或更高版本
  • uv / uvx(推荐)或 pip
  • 互联网访问(所有 API 均可公开访问)

安装

Claude Desktop(推荐)

添加到 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"]
    }
  }
}

重启 Claude Desktop——该服务会在首次使用时自动启动。

云端 / 可自托管(Streamable HTTP)
uvx swiss-academic-libraries-mcp --http --port 8000 [--host 127.0.0.1]

安全与部署说明

  • 默认绑定地址为 127.0.0.1(仅限环回地址)。该服务没有内置身份验证功能。
  • 仅在位于提供身份验证和基于 IP 的速率限制的反向代理之后运行时,才使用 --host 0.0.0.0(例如,配置了 limit_req 和 OAuth2-Proxy 的 nginx)。绑定到非环回地址时会输出 WARN 日志。
  • 日志输出到 stderr;使用 MCP_LOG_LEVEL=DEBUG|INFO|WARNING 设置详细级别。
开发
git clone https://github.com/malkreide/swiss-academic-libraries-mcp
cd swiss-academic-libraries-mcp
pip install -e .

快速入门

首先调用 library_info 以查看完整概览。然后:

"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) →

💡 “无需 API 密钥——安装后即可查询。”

CQL 搜索语法(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 = 11

配置

无需 API 密钥。所有环境变量均为可选项。

参数默认值说明
--http关闭启用 Streamable HTTP 传输
--port8000HTTP 传输端口
MCP_LOG_LEVELINFO日志详细级别(DEBUG/INFO/WARNING)
OA_LAW_CROSSREF_ENRICH1OA legal:通过 Crossref 补充 DOI→许可信息;设为 0 可禁用
OA_LAW_REPOSITORIUM_ANON_KEY(公共密钥)OA legal:用于覆盖 Repositorium.ch 的公共只读 Supabase 匿名密钥(无需更改代码即可轮换密钥)
CROSSREF_MAILTO(未设置)International:用于联系 Crossref“礼貌池”的电子邮箱(吞吐量更高)。若未设置,请求将使用匿名池——功能正常,只是速度较慢。
ARXIV_MIN_INTERVAL_SECONDS3.0International:arXiv 请求的最小间隔时间(arXiv 建议克制请求)。

项目结构

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 version

MCP 协议版本

此服务在同一端点上支持两个协议时期。客户端在连接上的第一个请求决定适用哪个时期;之后若声称属于另一个时期,则会被拒绝。

时期修订版本接入方
initialize 握手2024-11-05 … 2025-11-25当今客户端使用的版本。服务会返回请求的修订版本;若请求的版本更新,则返回上限 2025-11-25。
逐请求信封2026-07-28携带 2026-07-28 _meta 信封的请求会建立现代连接。

这两个修订版本都固定在 tests/test_protocol_version.py 中,并与已安装的 SDK 进行断言校验,因此 Dependabot 升级 mcp 时不会悄然改变它们。请注意,SDK 的 LATEST_PROTOCOL_VERSION 是现代时期的别名,而不是握手时期的别名——仅针对它固定版本,会让当前客户端实际协商的时期仍有漂移的空间。

实测,而非仅固定版本。 同一道验证门会在进程内针对 main() 提供服务的同一个 MCPServer 对象建立两个时期的连接,并读取线路上的响应:现代连接协商出 2026-07-28,旧版连接的上限为 2025-11-25,而此服务响应的六种规范方法(tools/list、resources/list、prompts/list、resources/read、prompts/get、tools/call)都带有现代信封。本节的早期版本曾声称,由于此仓库没有构建 ASGI 应用,无法在这里进行实测。其实根本不需要 ASGI 应用。

现代连接上的服务身份。 2026-07-28 没有 initialize,因此无法在其中一次性声明 serverInfo——SDK 会将其写入每个结果的 _meta(规范 #3002)。因此,此服务会从自身的包元数据填充该区块:通过 importlib.metadata 读取 version、description 和 websiteUrl,而非使用字面值,因此这些信息不会与 pyproject.toml 脱节。SDK 不会自行填入任何内容——接通此功能之前,尽管上方的两个版本固定值都通过了校验,每个响应中的标记仍是 {"name": "…", "version": ""}。这是常量固定值无法发现的缺口,也是验证门现在会进行实测的原因。

更新策略。 验证门失败时,不要盲目编辑常量:先阅读两个修订版本之间的规范变更日志,确认服务仍按预期运行,再同时更新常量、本节、README.de.md 和 CHANGELOG.md。


测试

# Unit tests (no network required)
PYTHONPATH=src pytest tests/ -m "not live"

# Live smoke tests (internet required)
PYTHONPATH=src pytest tests/ -m "live"
测试数据的来源

tests/fixtures/ 下的固件记录自实时数据源,使用与生产代码相同的请求参数,并注明日期。每个文件的来源、获取日期、选择规则和 SHA-256 值见: tests/fixtures/PROVENANCE.md。

python scripts/record_fixtures.py   # re-record

这很重要,因为手写的模拟数据会编码作者的假设,因此永远无法证伪该假设——生产代码和固件来自对文档的同一解读。臆造的 ListSets 响应没有携带 resumptionToken,因此没有测试能发现代码从未跟进该令牌:e-rara 分 10 页提供 105 个集合,而工具只报告了 10 个。

当固件经过删减时,计数字段(numberOfRecords、completeListSize 和 total-results)以及 resumptionToken 会保留真实值——它们说明文件中未包含多少内容。

tests/fixtures/oai_ex_ante_listrecords.xml 故意不是格式良好的 XML:ex/ante 会在 dc:description 中输出原始控制字符,而原样记录该字符,才能证明 strip_invalid_xml_chars 至关重要。

安全性与限制

  • 只读: 所有工具都向公开的 SRU 和 OAI-PMH 端点发送 HTTP GET 请求,不会写入、修改或删除任何数据。
  • 不涉及个人数据: API 返回的是书目元数据(标题、作者、出版信息、主题标题)和公开的数字化记录。不会处理或存储任何有关图书馆用户的个人身份信息(PII)。
  • 速率限制: swisscovery SRU 和 OAI-PMH 端点均为公开端点,没有记录在案的硬性限制;不过,OAI-PMH 收割通过续传令牌进行分页——请使用 from_date / until_date,并将 max_records 设为合理值。服务器会对每个请求强制执行 30s 超时。
  • 数据时效性: 结果反映查询时上游目录中的数据。本服务不执行缓存;索引延迟由 SLSP 和数字化平台控制。
  • 服务条款: 数据受各来源的服务条款和许可约束——swisscovery / SLSP、e-rara、e-periodica、e-manuscripta。大多数数字化资料属于公有领域或采用 Creative Commons 许可;重新分发前,请务必查看具体记录中的权利声明。
  • 不作保证: 这是一个社区项目,与 SLSP、ETH Library 或任何参与机构均无关联。服务可用性取决于上游 API。

贡献

欢迎贡献!请阅读 CONTRIBUTING.md,了解以下事项的指南:

  • 报告错误和请求新功能
  • 设置开发环境
  • 代码风格和测试要求
  • 提交拉取请求

本项目遵循 Swiss Public Data MCP Portfolio 的惯例。


安全

如需报告漏洞,请遵循 SECURITY.md 中的负责任披露流程。此服务为只读服务,无需 API 密钥;安全模型请参阅上文的 安全性与限制 一节。


更新日志

请参阅 CHANGELOG.md


瑞士公共行政部门部署指南

如果您为瑞士的学校管理机构、档案馆或市政用途自行托管此服务:

  • 数据驻留: 优先选择本地部署或位于瑞士的云服务提供商。查询模式本身(公务员执行的图书馆检索)可能会暴露正在进行的研究,最好保留在瑞士基础设施上。
  • 上游调用仅发送至托管在瑞士的服务:SLSP / swisscovery、ETH-Bibliothek(e-rara、e-periodica、e-manuscripta)。不会有数据离开瑞士。
  • 日志记录: 日志写入 stderr;请据此配置 IT 保留策略(例如 systemd-journal 的 MaxRetentionSec)。
  • HTTP 传输必须在配置了身份验证和每 IP 速率限制的反向代理后运行(参见上文的 安全与部署说明)。

许可证

MIT License — 请参阅 LICENSE


作者

Hayal Oezkan · github.com/malkreide


致谢与相关项目

服务描述
zurich-opendata-mcp苏黎世市开放数据
eth-library-mcpETH 图书馆检索与人员 API
swiss-statistics-mcp瑞士联邦统计局(BFS)
fedlex-mcp通过 Fedlex SPARQL 获取瑞士联邦法律
swiss-transport-mcpOJP 行程规划、SIRI-SX 中断信息

安装

通过 uv 的 uvx 运行,无需克隆或手动安装。将其添加到 MCP 客户端配置中(Claude Desktop、Cursor 和 Windsurf 使用 mcpServers;VS Code 在 .vscode/mcp.json 中使用顶层 servers 键):

{
  "mcpServers": {
    "swiss-academic-libraries-mcp": {
      "command": "uvx",
      "args": [
        "swiss-academic-libraries-mcp"
      ]
    }
  }
}

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。