swiss-academic-libraries-mcp について
学術研究向けのMCPサーバーで、スイスの図書館目録、デジタルコレクション、オープンアクセスの法律文献、国際的な研究メタデータを検索できます。オープンなプロトコルで複数の情報源を扱い、論文の全文ではなく書誌メタデータを返します。
主な機能
- 01swisscovery総合目録の検索
- 02デジタル資料、定期刊行物、手稿の閲覧
- 03スイスのオープンアクセス法律文献の検索
- 04DOI解決とCrossref、arXivの検索
- 05レコードの絞り込みとメタデータ取得
- 06stdioとStreamable HTTPに対応
活用シーン
- 01スイスの図書館に出版物が所蔵されているか確認
- 02デジタル化された歴史資料や手稿の調査
- 03法律文献を検索してライセンスを確認
- 04DOI、プレプリント、スイスの所蔵先を追跡
MCP 対応
読み取り専用の目録・メタデータ検索ツール、リソース、組み込みプロンプトをMCPクライアントに提供します。stdioとStreamable HTTPに対応しています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
16掲載時のツール一覧 · 2 週間前に更新
このツールにパラメーターはありません。
詳細
🇨🇭 スイス公共データ MCP ポートフォリオの一部です
📚 swiss-academic-libraries-mcp
スイスの学術図書館(swisscovery、e-rara、e-periodica、e-manuscripta)にアクセスできる MCP サーバーです。API キーは不要です。
デモ
概要
swiss-academic-libraries-mcp は、標準化されたオープンプロトコルを通じて、AI モデルをスイスの学術図書館インフラ全体に接続します。swisscovery総合目録(500 以上の図書館、1,000 万件以上のレコード)と、3 つのデジタル化プラットフォーム、すなわち歴史的刊行物(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によるプレプリントに対応します。これにより、1 回の会話で「これはスイス国内に所蔵されていますか?」(国内レイヤー)と「これは何で、ほかにどこで公開されていますか?」(国際レイヤー)の両方に答えられます。解決されたすべての 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)
- 3 つすべてのデジタル化ポータル向けの Dublin Core パーサー
- 2 種類のトランスポート:Claude Desktop 向けの stdio · クラウド/セルフホスト可能なデプロイ向けの Streamable HTTP
- sui generis、ex/ante、Repositorium.ch を対象とする オープンアクセス法律文献検索。宣言型ソースレジストリ(新しいソースは設定を 1 つ追加するだけ)、Crossref ライセンス情報のベストエフォートによる補完、ソースごとの適切な縮退動作に対応します
- 国際メタデータレイヤー:Crossref による DOI 解決と書誌検索(
CROSSREF_MAILTOによるポライトプール)、自動的にフレーズを引用符で囲みリクエストをスロットリングする arXiv によるプレプリント検索。swisscovery での検索に活用できる、整ったタイトル/ISSN/ISBN/著者フィールドを提供します - 組み込みプロンプト 3 件:
research-workflow、education-research、doi-to-swiss-shelf - すべてのツールで Markdown および JSON 出力に対応します
- ユニットテスト/モックテスト 97 件(ネットワーク不要)とライブスモークテスト 30 件
データソース
| ソース | プロトコル | 内容 | レコード数 |
|---|---|---|---|
| swisscovery (SLSP) | SRU / MARC21 | スイスの 500 以上の図書館 | 1,000 万件以上 |
| 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 |
アーキテクチャ
3 つの独立したパスが 1 つの 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 にキーワード検索機能が備わっていないためです。4 つ目の OA ソースの追加は、コードを新たに書くのではなく、レジストリにエントリーを 1 つ追加するだけです。
- 国際文献パスは、DOI の解決と Crossref/arXiv のライブ検索を行います(アーキテクチャ A — エンドポイントは小規模で安定しており公開されているため、ダンプやキャッシュは不要です)。各レスポンスには、集約したものではなくそれぞれのソースの帰属表示(Crossref CC0 · arXiv の謝辞)が含まれます。また、モデルが目録パスへ展開できるよう、トップレベルに整理されたタイトル/ISSN/ISBN/著者フィールドを返します。コード層の送信先許可リストにより、外部呼び出し先を
api.crossref.orgとexport.arxiv.orgに制限します。
ライセンスと対象範囲
このサーバーは、出力内容を意図的に慎重に制限しています。ガバナンスを機能として重視するポートフォリオでは、この点に油断は禁物です。
- 全文ではなくメタデータ。 OA 法律文献について、サーバーが返すのはタイトル、著者情報、出版年、ライセンス、DOI/リンク、およびソースにメタデータとして含まれている場合は要旨です。記事本文を取り込んだり、保存したり、出力したりすることはありません。Repositorium.ch が公開している全文 PDF のパスは、意図的にいずれのフィールドにも含めていません。
licenceは常に設定されます。 オープンアクセスとは無料で読めるという意味であり、自由に再利用できるという意味ではありません。ライセンスには CC0 や CC BY から CC BY-NC-ND まであり、オープンライセンスがなく、単に「無料で読める」記事もあります。機械可読なライセンスがない場合、フィールドには"unknown"が設定されます。推測して設定することも、省略することもありません。3 つのソースのネイティブ OAI メタデータには著作権表示しか含まれていないため、既定値は"unknown"です。最善努力で Crossref を照合し、DOI からライセンスを確認できた場合は、実際の CC ライセンスに更新します(例:sui generis →CC BY-SA 4.0)。OA_LAW_CROSSREF_ENRICH=0で無効にできます。- 引用の完全性。 すべての結果には、解決可能な参照情報が含まれます。DOI がある場合は DOI、ない場合は永続 URL です。参照情報のない結果は出力されません。法律文献では、架空の引用は引用がないよりも悪いため、サーバーは結果を 1 件増やすより、捏造した引用を 1 件も出さないことを優先します。
- 言語情報は保持し、無言でフィルタリングしません。 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 機関のディスカバリーと人物情報)とは重複しません。カタログは書籍を見つけ、OA 法律文献の機能は、ライセンスと DOI が付いた、無料で読める記事を見つけます。
既知の制限事項
- 小規模で対象を絞ったコーパスです。 3つのOAソースを合わせても、収録記事数は数百件程度です。検索結果は関連度順に並びます。すべての検索語に一致する記事が先に表示され、その後に一部の検索語に一致する記事が続きます。そのため、*「Datenschutz im Bildungsbereich」*のようなトピック検索では、何も表示されずに終わるのではなく、プライバシー法関連のコーパスから関連する記事が表示されます。トピック全体の交差部分を扱う記事がない場合は、最も近い実在の記事が返され、捏造された記事が返されることはありません。検索語がひとつも一致しない場合は、正直に空の結果が返されます。
- 全文検索には対応していません。 検索対象はメタデータ(タイトル、抄録、著者情報)のみで、記事本文は対象外です。
- DOI の収録状況にばらつきがあります。 sui generis は約 100 %、Repositorium.ch は一部のみ、ex/ante は DOI がありません(永続 URL のみ)。そのため、アグリゲーター(Crossref/OpenAlex)は sui generis を十分にカバーする一方、ex/ante はまったく対象にできず、Repositorium.ch もソースとしてインデックスしていません。これが、アグリゲーターに依存せず、サーバーが各ソースからネイティブにデータを収集する理由です。
- ライセンス情報に抜けがあります。 ネイティブのメタデータに機械可読なライセンスが含まれることはまれで、
"unknown"が一般的です。Crossref で DOI を解決できる場合にのみ、ライセンス情報を補完しています。 - 有料の法律データベースの代替にはなりません。 ここで扱うのは、無料でアクセスできるスイスの法学研究のみです。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 リダイレクトする | 応答は JSON ではなく Atom です。arXiv はリクエスト間に約 3 秒置くよう求めています。通常の http:// エンドポイントは 301 リダイレクトします。 | パーサーは既存の依存関係である defusedxml を再利用するため、新たな依存関係は追加されません。モジュールレベルの間隔制御(ARXIV_MIN_INTERVAL_SECONDS、既定値 3 秒)によってリクエスト間隔を確保し、クライアントは https:// エンドポイントを直接呼び出します。 |
| SHARE(share.osf.io)— 評価済み、実装せず | _search エンドポイントは応答します(Elasticsearch 形式で約 5,890 万件)。ただし、SHARE は 2020 年に収集を終了し、データベースを CurateND にアーカイブしています。また、API の保守を継続する保証はありません(「shutting down / new phase」、現在は「trove」search-api)。信頼性を重視するポートフォリオにとって、サポート保証のないインデックスは依存先として適切ではありません。 | 実装していません。 |
| Open Library — 評価済み、採用基準を満たさず | 実在するスイス/ドイツ語の教材(Lehrmittelverlag Zürich、Klett und Balmer。ISBN は swisscovery から収集)の ISBN 10 件を調査した結果は 0/10 = 0 % でした(しきい値 60 %)。対照試験では Open Library が機能すること(英語および一般的なドイツ語の商業書籍が解決される)を確認したため、これは接続上の問題ではなく、実際のカバー範囲の不足です。 | 実装していません。 swisscovery はすでにスイスの教材をカバーしています。書籍の商取引には、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(ループバックのみ)です。サーバーには認証機能が組み込まれていません。 --host 0.0.0.0を使用するのは、認証と IP ごとのレート制限を提供するリバースプロキシの背後で実行する場合に限ります(例: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 anon key を上書きします(コードを変更せずにキーをローテーションできます) |
CROSSREF_MAILTO | (未設定) | International:Crossref の「polite pool」用の連絡先メールアドレスです(スループットが向上します)。未設定の場合、リクエストは匿名プールを使用します。機能しますが、速度は遅くなります。 |
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 プロトコルのバージョン
このサーバーは、同じエンドポイントで2つのプロトコル時代に対応しています。接続時のクライアントの最初のリクエストによって適用される時代が決まり、後から別の時代を主張しても拒否されます。
| 時代 | リビジョン | 対応するクライアント |
|---|---|---|
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 が上限となり、このサーバーが応答する仕様上の6つのメソッド(tools/list、resources/list、prompts/list、resources/read、prompts/get、tools/call)のすべてにモダンなエンベロープが付与されます。このセクションの以前のバージョンでは、このリポジトリには ASGI アプリがないため実測テストは不可能だと述べていました。しかし、その必要はありませんでした。
モダンな接続でのサーバー識別情報。 2026-07-28 には、serverInfo を一度だけ記述する initialize がありません。SDK はすべての結果の _meta に識別情報を記録します(仕様 #3002)。そのため、このサーバーは自身のパッケージメタデータからそのブロックを設定します。version、description、websiteUrl は importlib.metadata を介して読み取られ、リテラル値は使用しないため、pyproject.toml と食い違うことはありません。SDK が独自の値を代入することはありません。これを組み込む前は、上記の2つのバージョン固定がどちらも合格している一方で、すべての応答に記録された値は {"name": "…", "version": ""} でした。定数の固定では検知できないのがこの問題であり、そのためゲートで実測するようになりました。
更新方針。 ゲートに失敗した場合、定数をそのまま編集しないでください。2つのリビジョン間の仕様変更履歴を確認し、サーバーが引き続き正しく動作することを検証してから、定数、このセクション、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 とデジタル化プラットフォームによって決まります。
- 利用規約: データには、各データソースの ToS とライセンスが適用されます — 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 をご覧ください。
スイスの行政機関向けデプロイ
スイスの教育委員会、アーカイブ、 または自治体で利用するためにこのサーバーをセルフホストする場合:
- データの保管場所: オンプレミス、またはスイス国内に拠点を置くクラウドプロバイダーを推奨します。 クエリのパターン自体(公務員がどの図書館を検索したか)から、進行中の調査内容が明らかになる可能性があるため、スイス国内のインフラに保管するのが最適です。
- 上流への呼び出し: CH でホストされているサービス(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 Library の資料検索・人物 API
- ポートフォリオ: Swiss Public Data MCP Portfolio
| サーバー | 説明 |
|---|---|
zurich-opendata-mcp | チューリッヒ市のオープンデータ |
eth-library-mcp | ETH Library の資料検索・人物 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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。