关于 swiss-academic-libraries-mcp
面向学术研究的 MCP 服务,可搜索瑞士图书馆目录、数字化馆藏、开放获取法律文献及国际研究元数据。它通过开放协议汇集多类来源,并仅提供书目元数据,不返回论文全文。
主要功能
- 01搜索 swisscovery 联合目录
- 02浏览数字化古籍、期刊和手稿
- 03搜索瑞士开放获取法律文献
- 04解析 DOI 并搜索 Crossref 和 arXiv
- 05筛选记录并获取元数据
- 06支持 stdio 和 Streamable HTTP 传输
适用场景
- 01确认瑞士图书馆是否收藏某出版物
- 02查找数字化历史资料或手稿
- 03搜索法律文献并查看许可信息
- 04追踪 DOI、预印本及瑞士馆藏
MCP 相关
向 MCP 客户端提供只读目录与元数据搜索工具、资源和内置提示词。支持 stdio 与 Streamable HTTP 传输。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
16收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
📚 swiss-academic-libraries-mcp
提供瑞士学术图书馆访问能力的 MCP 服务,涵盖 swisscovery、e-rara、e-periodica 和 e-manuscripta。无需 API 密钥。
演示
概述
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 / MARC21 | 500 多家瑞士图书馆 | 1000 万以上 |
| e-rara | OAI-PMH / Dublin Core | 数字化历史印刷品 | 25 万以上 |
| e-periodica | OAI-PMH / Dublin Core | 数字化期刊(1750 年至今) | 100 多万篇文章 |
| e-manuscripta | OAI-PMH / Dublin Core | 手稿和档案资料 | 10 万以上 |
开放获取法律文献(仅元数据)
| 来源 | 协议 | 内容 | DOI 覆盖率 |
|---|---|---|---|
| sui generis | OAI-PMH / Dublin Core | 开放获取法律期刊和非营利出版商 | 约 100 %(10.21257/…) |
| ex/ante | OAI-PMH / Dublin Core | 同行评审期刊,刊载(青年)法律学术研究,多语言 | 无(持久 URL) |
| Repositorium.ch | Supabase / PostgREST (JSON) | 瑞士法律学科知识库 | 部分 |
国际元数据层(仅元数据)
| 来源 | 协议 | 内容 | 许可 |
|---|---|---|---|
| Crossref | REST / JSON | DOI 解析 + 国际研究文献 | 元数据采用 CC0 1.0(公有领域) |
| arXiv | Atom / XML | 预印本(计算机科学、物理、数学、统计学等) | 元数据采用 CC0 1.0;预印本遵循作者许可 |
工具
| 工具 | 来源 | 功能 |
|---|---|---|
library_info | — | 入口:所有来源和工具的概览 |
swisscovery_search | swisscovery | 在联合目录中进行全文/CQL 搜索 |
swisscovery_get_record | swisscovery | 根据 MMS-ID 获取单条记录 |
erara_list_records | e-rara | 按日期/馆藏筛选并列出印刷品 |
erara_get_record | e-rara | 根据 OAI 标识符获取单件藏品 |
erara_list_collections | e-rara | 所有参与的图书馆 |
eperiodica_list_records | e-periodica | 按日期筛选文章 |
eperiodica_get_record | e-periodica | 根据 OAI 标识符获取单篇文章 |
emanuscripta_list_records | e-manuscripta | 按日期/馆藏筛选手稿 |
emanuscripta_get_record | e-manuscripta | 根据 OAI 标识符获取单件对象 |
emanuscripta_list_collections | e-manuscripta | 所有档案馆/馆藏 |
oa_law_search | OA legal (all 3) | 搜索 OA 法律学术成果(标题/摘要/作者),并按来源、语言、年份和同行评审情况筛选 |
oa_law_get | OA legal (all 3) | 根据 DOI 或可解析的 URL 获取单篇 OA 法律文章 |
resolve_doi | Crossref | 将 DOI 解析为完整元数据(标题/ISSN/ISBN/作者 → 转入 swisscovery) |
search_publications | Crossref | 搜索国际研究文献;每条结果都包含 DOI |
search_preprints | arXiv | 搜索预印本并自动为短语加引号;关联期刊 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 传输 |
--port | 8000 | HTTP 传输端口 |
MCP_LOG_LEVEL | INFO | 日志详细级别(DEBUG/INFO/WARNING) |
OA_LAW_CROSSREF_ENRICH | 1 | OA legal:通过 Crossref 补充 DOI→许可信息;设为 0 可禁用 |
OA_LAW_REPOSITORIUM_ANON_KEY | (公共密钥) | OA legal:用于覆盖 Repositorium.ch 的公共只读 Supabase 匿名密钥(无需更改代码即可轮换密钥) |
CROSSREF_MAILTO | (未设置) | International:用于联系 Crossref“礼貌池”的电子邮箱(吞吐量更高)。若未设置,请求将使用匿名池——功能正常,只是速度较慢。 |
ARXIV_MIN_INTERVAL_SECONDS | 3.0 | International: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
致谢与相关项目
- 数据(目录): swisscovery / SLSP · e-rara · e-periodica · e-manuscripta
- 数据(开放获取法律文献): sui generis · ex/ante · Repositorium.ch — 通过 Crossref 补充许可信息。各来源的元数据均依其各自条款使用;开放获取状态并不意味着拥有开放再利用许可。
- 协议: Model Context Protocol — Anthropic / Linux Foundation
- 相关项目: eth-library-mcp — ETH 图书馆检索与人员 API
- 项目集: Swiss Public Data MCP Portfolio
| 服务 | 描述 |
|---|---|
zurich-opendata-mcp | 苏黎世市开放数据 |
eth-library-mcp | ETH 图书馆检索与人员 API |
swiss-statistics-mcp | 瑞士联邦统计局(BFS) |
fedlex-mcp | 通过 Fedlex SPARQL 获取瑞士联邦法律 |
swiss-transport-mcp | OJP 行程规划、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"
]
}
}
}
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。