OpenCaseLaw — Swiss Caselaw, Statutes & Doctrine について
OpenCaseLawは、法律研究者やAIツール向けにスイスの判例、法令、引用データを提供します。ドイツ語、フランス語、イタリア語の資料をMCPサーバーで検索でき、REST、CLI、Parquetでも利用できます。
主な機能
- 01100万件超の裁判記録検索
- 02連邦法・州法の検索
- 03判例と法令の引用関係の探索
- 04判決構成と該当箇所の取得
- 05立法資料と注釈へのアクセス
活用シーン
- 01スイス各裁判所の判決検索
- 02主要判例と上訴経路の追跡
- 03法律文書の引用確認
- 04共有可能な調査資料の作成
MCP 対応
リモートMCPサーバーは、判決や法令の検索、引用関係の探索、構造化された法律資料の取得に使える公開研究ツールを42個提供します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://mcp.opencaselaw.ch/mcpclaude mcp add --transport http ch-opencaselaw-swiss-caselaw https://mcp.opencaselaw.ch/mcp{"mcpServers":{"ch-opencaselaw-swiss-caselaw":{"type":"http","url":"https://mcp.opencaselaw.ch/mcp"}}}Cursor で開く{"servers":{"ch-opencaselaw-swiss-caselaw":{"type":"http","url":"https://mcp.opencaselaw.ch/mcp"}}}VS Code で開く{"mcpServers":{"ch-opencaselaw-swiss-caselaw":{"type":"http","url":"https://mcp.opencaselaw.ch/mcp"}}}{"mcpServers":{"ch-opencaselaw-swiss-caselaw":{"serverUrl":"https://mcp.opencaselaw.ch/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://mcp.opencaselaw.ch/mcphttps://mcp.opencaselaw.ch/sseツール
42| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | 結果の最大数(デフォルト 10、最大 50)。 |
| query | string | はい | 自然言語またはキーワードによるクエリ。 |
詳細
OpenCaseLaw
法律調査と AI のための、スイスの判例法と法令。
100 万件以上の決定 · 全 26 州 · 1875 年〜現在 · 引用グラフ · MCP + REST + CLI + Parquet · CC0 データ · MIT コード
検索を試す · AI とチャットする · 調査を自動化する · データセットをダウンロードする · API ドキュメント
できること
- ドイツ語、フランス語、イタリア語で、連邦裁判所と州裁判所のスイスの判決を検索できます。
- 判例間の引用をたどり、ある論点に関する主要な判決を特定できます。
- Claude、ChatGPT 対応クライアント、または任意の MCP クライアントから、判例法と法令を検索できます。
- 再利用可能な調査スクリプトを保存し、引用の解決結果を確認して、選択した証拠を 調査 CLI で保管できます。
- 法律分野の NLP、検索、グラフの研究に向けて、コーパスをダウンロードできます。
30 秒で接続
{
"mcpServers": {
"opencaselaw": {
"url": "https://mcp.opencaselaw.ch/mcp"
}
}
}
サインアップ不要、API キー不要、読み取り専用です。42 個のツールを利用できます。各クライアントの設定ガイドは opencaselaw.ch/mcp にあります。
Anthropic の Claude for Legal プラグインをお使いですか? 契約レビューと NDA のトリアージスキルをスイス法の下で利用でき、各条項を法令ミラーで検証するスイス向けプレイブックは、 opencaselaw.ch/claude/legal.local.md にあります。 設定ガイドもご覧ください。
調査を自動化する
ocl は公開調査 API を利用する小さなコマンドラインクライアントで、
チャットウィンドウでは不得意な次の 2 つの作業を想定しています。草案内の引用を確認することと、
メモの根拠となる証拠を共有可能なフォルダーに保存することです。PyPI では
opencaselaw-cli として公開されています。
pipx install opencaselaw-cli # or: uv tool install opencaselaw-cli
ocl citations resolve 'BGE 136 III 513' '4A_747/2012' 'BGE 999 III 1'
ocl bundle create 'Rachekündigung Art. 336 OR' --max-results 10 --passage 2 --law OR:336 --out evidence
1 つ目のコマンドは、参照ごとに、判決が存在するか、どの判決なのか、指定された Erwägung が存在するかを出力します。
2 つ目のコマンドは、選択した判決、抜粋、法令条項を、平易な言葉で書かれた INDEX.md とハッシュ付きの manifest.json を含むフォルダーに保存します。すべてサービスから変更されずに返されます。引用文字列、抜粋テキスト、ソースへのリンクもそのままです。検索範囲には上限があり、引用チェックで確認できるのは判例の存在であり、その判例がある主張を裏付けるかどうかではありません。CLI ガイドをご覧ください。
会話には MCP、自動化には CLI または REST API、コーパス規模の分析には Parquetをお使いください。
実際の検索結果
質問。 従業員が権利を主張したことへの報復として行われた解雇は、スイス法の下でどのような場合に濫用となりますか?
1 回の呼び出し — search_decisions("missbräuchliche Kündigung Rachekündigung")
を実行すると、129 件の判決が返され、最初に主要な判決が表示されます。
BGE 136 III 513(2010 年 10 月 7 日)
Art. 336 OR; missbräuchliche Kündigung. Der Arbeitnehmer ist vor einer Rachekündigung nur geschützt (Art. 336 Abs. 1 lit. d OR), sofern er nach Treu und Glauben annehmen kann, dass die von ihm geltend gemachten Ansprüche berechtigt sind. Es ist nicht erforderlich, dass sie tatsächlich begründet sind.
Regeste は保存されている公式の要旨からそのまま返され、引用文字列は保存されたフィールドから取得されます。ツールが引用を生成することはありません。この仕様によって、もっともらしいだけの回答ではなく、検証可能な回答になります。
再現するには:
curl -sG https://mcp.opencaselaw.ch/api/decisions \
--data-urlencode "q=missbräuchliche Kündigung Rachekündigung" \
--data-urlencode "limit=3"
対象範囲
| リソース | 対象範囲 |
|---|---|
| 裁判所の判決 | 1,050,000 件以上の記録、118 の裁判所および情報源コレクション、1875 年から現在まで |
| 言語 | ドイツ語、フランス語、イタリア語(英語が唯一の正式な本文であるECtHRの判決については、英語も含みます) |
| 法令 | 連邦法5,525件、州法15,600件(全26州) |
| 引用グラフ | 解決済みの判決間エッジ約1,000万件、法令への参照1,240万件 |
| 解釈レイヤー | 連邦参事会の教書、注釈書、オープンアクセスの研究成果、連邦行政実務 |
| アクセス | ウェブ、MCP、REST、調査用CLI、毎日更新されるCC0 Parquet |
| ライセンス | CC0データ、MITコード(ECtHRの本文は© ECHR-CEDH。data cardを参照) |
件数は単一の信頼できる情報源である
docs/canonical_numbers.mdから生成されます。
各数値の検証方法も同じ場所に記録されています。
制限事項を率直に説明します。 ポータルによってアクセスが制限されている場合、対象範囲は完全ではありません。そうした情報源は、曖昧にせず明記しています。引用グラフで示しているのは解決のカバレッジ(93.8 %)であり、精度の推定値ではありません。人手による意味監査を準備中です。一部の州の判決は、裁判所によって匿名化されずに公開されている場合があります。上流の仮名化を引き継いでおり、こちらでは再度仮名化していません。ガバナンスと削除ポリシーを参照してください。
週の様子を描く
毎週金曜日、スイス判例の1週間を、サイトの各言語につき1つずつ、5種類のデザインで描きます。地形図(ドイツ語)、151年を線で表現した図(フランス語)、スコア(イタリア語)、色面(ロマンシュ語)、レシート(英語)です。同じ週、同じ数値です。全アーカイブはopencaselaw.ch/postersにあります。
ポスターは、コミットされたdocs/stats.jsonの履歴をもとにscripts/weekly_poster_editions.pyで生成されます。コーパスと同様、CC0です。
貢献
データ品質に関する報告は、最も価値ある貢献です。これまでの報告はすべて再現され、修正され、回帰テストで固定されています。CONTRIBUTING.mdを参照してください。
このページの以下の内容は、参考情報の詳細です。
これが存在する理由
現在のスイスの法務調査は、ペイウォールによって分断され、言語モデルからアクセスできず、最も必要としている人々、つまり法学生、独立研究者、大手法律事務所に属さない人々にとって、非常に高額です。 商用データベース(Weblaw、Swisslex、Legalis)は月に数百フランを請求する一方で、クリーンなAPIすら公開していません。LLMには信頼できる情報源がないため、法令の本文を幻覚します。小規模な州は、誰も索引化していないPDFアーカイブで判決を公開しています。
OpenCaseLawはこの問題を解決します。公開されたスイスの裁判所の判決すべて、連邦法と州法すべて、それらを結ぶ解決済みの引用グラフ、そして現代のあらゆるLLMをスイス法務調査アシスタントとして機能させる44のMCPツール(パブリックモードのリモートツール42個+ローカル専用ツール2個)を、すべて無料で、オープンに、自動更新で提供します。
利用できるもの
判例法 — 1875年から現在までの118の裁判所の判決記録を1,050,000件以上収録(固有の判決は約909,000件。識別子の異なる重複は保持して相互にリンクし、削除しません)。全文と構造化メタデータを提供します。
- 7つすべての連邦裁判所(BGer、BVGer、BStGer、BPatGer、BGE、BGE historical、BGE-EGMR)
- 連邦軍事裁判所(Militärkassationsgericht / MKG、1915~2025年の判決1,244件)
- 26すべての州裁判所制度(第一審、第二審、第三審)
- 規制当局の決定(FINMA、ComCo、FDPIC、IndepBC、ElCom、PostCom、ComCom)
- ECHR/EGMR:スイスが被申立国の資料(BGEに掲載されたEGMR翻訳487件、HUDOCでスイスのタグが付いた847件)に加え、46の被申立国のいずれかに対する、重要度1~3のECtHR小法廷および大法廷の判決をすべて収録 — 8,275件。裁判所がフランス語版を公開している場合はフランス語、それ以外は英語です。重要度4(重要度が低く、反復的なもの。委員会の案件全体が該当)および受理可能性の決定は対象外です。
- 3つの公用語:ドイツ語463,012件(46.7%)、フランス語446,869件(45.1%)、イタリア語81,796件(8.2%)。スキーマではロマンシュ語用に
rmを予約しています。 - 事件番号の正規化とコンテンツ長を考慮した統合により重複を排除
- 毎日更新。BGerの判決は裁判所の公開から約15分以内に利用可能です。
法令 — 連邦法と州法を含むスイスのすべての法令をローカルにミラーリングし、条文単位でインデックス化しています。
- Fedlex SPARQL エンドポイントから取得した連邦法5,525件/各DE/FR/IT版約133,359条
- 26州すべてから直接スクレイピングした州法15,600件/361,430条(LexWorkは18州、SILは2州、ZH OpenDataはZH、TI~RLはTIをカバー)。LexFindによるPDFのフォールバックで、主要ポータルにない法令を4州分補完しています。
- 統合SQLite FTS5検索で両コーパスを横断検索。条文検索はサブミリ秒です。
- 毎月2日に更新(法令の施行日の翌日)
- 判決から個々の法令条文への解決済みリンク1,240万件
引用グラフ — スイスの法制度を対象とする、大規模な公開引用グラフとして唯一のもの:
- 解決済みの判決間引用エッジ965万件(抽出数1,000万件)と信頼度スコア
- 現行の統合本文に照合して解決した、判決から法令へのリンク1,240万件
- 双方向検索、上訴経路(Instanzenzug)の解決、引用権威による主要判例のランキング
find_leading_cases、find_citations、find_appeal_chain、analyze_legal_trendを提供(最多引用例:被引用数85,108件のBGE 125 V 351) 44 個の MCP ツール(公開モードではリモートが 42 個、ローカル専用が 2 個) — お好みの LLM で実行できる、専門的なリサーチツールです。- 自然言語による判例検索(BM25 + 同義語拡張 + Haiku による再ランキング。100 件のクエリで構成されたゴールデンセットで MRR@10 = 0.647)
- 主要判例の発見、引用ネットワーク、上訴経路、判例法の変遷
- 連邦法・州法の条文検索と、両方を対象とする全文検索 — 日常語から法律用語への語彙拡張(「Vaterschaftsurlaub」で検索すると、法令上の表記が「Urlaub des andern Elternteils」であっても該当条文が見つかります)と、複数言語にまたがる州法検索(ドイツ語のクエリでフランス語・イタリア語の州法が見つかります)
- 法律解説の概要(法令 + 権威度順の BGE + 年表 + Botschaft 参照)
- 立法経緯(Materialien) — 9,139 件の BBl 刊行物と 33,465 件の法令・条文の組み合わせにわたる 83,958 件の Botschaft 改正参照。Bundesblatt Materialien の全文(ドイツ語・フランス語・イタリア語による 19,800 件以上の文書、約 165 万段落:連邦参事会の Botschaft、報告書、連邦参事会の意見書、議会委員会報告書、法令草案。1999 年以降は Fedlex の資料を網羅し、1850~1999 年の資料は連邦公文書館のスキャンから追加中。関連する法令条文へのリンクは 26,500 件以上)と、1993 年以降に Fedlex で公開された連邦のすべての意見募集手続き(連邦司法庁の立法プロジェクトに関する 2,694 件の手続き、全文 10,296 件:説明報告書、法案、結果報告書、意見書。意見書は 2016 年以降、Fedlex で体系的に公開)を、
search_botschaft(全文コーパスを対象とするトピック別 FTS5 検索。doc_typeで絞り込み可能)、get_materialien(Fedlex が法律に関連付けた文書と意見募集、および条文に関する説明報告書の該当箇所)、get_article_purpose(特定の条文に関する Botschaft の原文)、get_article_history(法令 + Botschaft + 主要判例 + 注釈をまとめた時系列)から利用できます。BV と BGFA については、条文ごとのダイジェスト(立法趣旨、主要な議論、制度設計上の選択、採用されなかった代替案)を提供します。BV については議会審議の逐語録も利用できます。Fedlex SPARQL による発見を通じて、約 25,000 件の Botschaft の全文取り込みを拡大しています。 - 判決構造へのアクセス —
get_decision_structure(Sachverhalt + Erwägungen + Dispositiv + Regeste を分割)、get_erwaegung(スイスの引用方式に基づく Einheit の原文。例:get_erwaegung("BGE 136 III 513", "2.3"))、get_regeste(BGer/BVGer/BStGer の公式見出し) - OnlineKommentar.ch と OpenLegalCommentary.ch の学術的注釈検索(1,131 件の注釈)
- 実際の BGE の事実関係から生成した Fallbearbeitung 試験問題。演習用に分析部分は非表示です
- 事実関係から模擬判決の草案を作成(LLM の出力を根拠付けるためのリサーチ専用ツール)
- 構造化された判例要約(regeste、Sachverhalt、Erwägungen、Dispositiv、引用された法令、権威)
複数の利用方法 — AI とチャットする、リサーチを自動化する、またはコーパスをダウンロードする:
LLM ユーザー、研究者、開発者向け:
mcp.opencaselaw.chのリモート MCP サーバー(SSE + Streamable HTTP)— 任意の MCP クライアント(Claude、ChatGPT、Cursor、Gemini、Windsurf)で 30 秒でセットアップできます- Grok/xAI や、関数呼び出しに対応した任意の LLM API 向けの OpenAI 互換ツール定義
- ローカル MCP サーバー — 44 個すべてのツールを完全オフラインで利用可能(ローカル専用の更新ツール 2 個もオフラインで使用できます)。ディスク容量は約 65 GB です
- 軽量リサーチ CLI — JSON/JSONL、バッチ入力、証拠バンドルの保存、引用の解決に対応。
pipx install opencaselaw-cli。ソースはclients/python/にあります - インタラクティブなドキュメント付き REST API(Swagger UI + OpenAPI 仕様)
- HuggingFace データセットからの Parquet 一括ダウンロード(約 7 GB)
- opencaselaw.ch のライブダッシュボードと閲覧 UI 文書を作成する法律実務家向け — 実務家向けに厳選した機能:
- Word アドイン — 判例を検索し、正しい書式のスイス法令・判例引用を Word に直接挿入します(コピー&ペースト不要)。判例の考慮事項をクリックすると正しい下位引用付きで挿入され、法律の条項をクリックするとその項が挿入されます。無料の Audit は、文書全体をスキャンして、捏造された引用や不適切なピンポイント引用を検出します(決定論的で、LLM は使用しません)。Pro プラン(Stripe による課金、月額 CHF 5、1 日 25 回の AI 呼び出しを共有、クライアント側で常時 PII を秘匿 — パターンベースで、対象範囲と制限についてはこちら)では、4 つの AI ツールを利用できます:Verify(単一の引用を判例全文と照合)、Strengthen(主要判例の提案を引用グラフの中心性で順位付けし、解説の抜粋を添えた段落の X 線分析)、Find Support(裏付けのない記述を支持する判例を検索し、0~100 点で評価)、Reflect(文書全体を文学的な鏡として映し出す — 同じ人間のジレンマを描く代表的な作品 1 点と、内省を促す質問 1 つ)。44 個の MCP ツールのうち約 8 個(パブリックモードではリモート 42 個、ローカル専用 2 個)を REST API 経由で提供し、法律文書の作成ワークフローに最適化されています。
論文で裏付けられるパフォーマンス:
| 指標 | 値 |
|---|---|
| 判例検索品質 | MRR@10 = 0.647(オンライン) / 0.470(再現可能なオフライン) · ベースライン比 +102 % |
| 条文検索のレイテンシ | < 1 ms(ローカル FTS5) |
| BGer の公開から検索可能になるまで | 約 15 分(ポーラー導入前は 24 時間) |
| 全文の日次再構築 | 約 5 時間、ダウンタイムなし(アトミックスワップ) |
| 引用から判例への解決 | 9.65 M 件のエッジを解決(1,000 万件を抽出) |
これは何か
スイスの裁判所の判決を構造化して検索できるアーカイブです。連邦最高裁判所(BGer)から、26のすべてのカントンのカントン裁判所までを網羅しています。各判決には、判決全文、事件番号、日付、言語、法分野、裁判官、引用された判決、および20項目以上の追加メタデータが含まれます。
このデータセットは、裁判所の公式ウェブサイトやカントン裁判所のポータルを直接スクレイピングして構築されています。新しい判決は毎晩スクレイピングされ、重複が除かれたうえで公開されます。
必要に応じて、8つの方法で利用できます。
| 方法 | 対象 | 利用できる内容 |
|---|---|---|
| AI で検索 | すべての方 | Claude、ChatGPT、Cursor、Gemini で自然言語検索。すぐに利用でき、ダウンロード不要で、24個のツールをすべて利用できます |
| 引用分析 | 法学者、研究者 | 先例判決、引用ネットワーク、上訴の連鎖、経時的な判例法の動向 |
| 法令検索 | 法律の専門家 | 5,525件の連邦法と15,600件のカントン法の条文全文、連携型 FTS5、ミリ秒未満の検索 |
| 立法検索 | 法律の専門家 | LexFind を活用した検索。fetch_top_n_texts により、単一呼び出しで自然言語のワークフローを実現 |
| 教育ツール | 法学生、講師 | 構造化された判決要旨、法理のタイムライン、分析を非表示にした実際の BGE 試験問題 |
| Word アドイン | 法律文書を作成する法律実務家 | 書式設定済みのスイス式引用を Word に挿入 · Erwägung / § をクリックして、正しいサブ参照付きで挿入 · 無料の Audit(5段階の引用チェック) · Pro(月額 CHF 5、1日25回の AI 呼び出し):Verify(引用と全文の照合) · Strengthen(段落の X 線分析と先例判決の提案) · Find Support(記述を裏付ける判決の検索) · Reflect(文章を映す鏡)—厳選された約8ツールのサブセット |
| REST API / ダウンロード | 開発者、データサイエンティスト、NLP 研究者 | 研究用 REST API、HuggingFace 経由の Parquet 一括ダウンロード(約7 GB) |
| Web UI | すべての方 | コーパスの統計、日次の差分、注目度が上昇している判決、多言語での閲覧ができるライブダッシュボード |
どこから始めればよいかわからない場合は? リモート MCP サーバーに接続してください。Claude、ChatGPT、Gemini CLI で利用できます。ダウンロード不要で、1,050,000件以上の判決、引用分析、法令検索、立法検索、教育ツールをすぐに利用できます。
1. AI で検索
このデータセットには、デプロイ方法によって正確なツール構成が異なる MCP サーバーが付属しています。ローカルデプロイでは44個すべてのツールを利用できます。リモートモードではローカル専用の更新ツール2個(update_database、check_update_status)が除かれ、リモートツールは42個になります。自然言語で質問すると、ツールが全文検索を実行し、該当する判決をスニペット付きで返します。
リモートとローカルの比較
| リモート | ローカル | |
|---|---|---|
| セットアップ | 30秒 | 30~60分 |
| ディスク容量 | 不要 | 約65 GB |
| ツール | 38個(ローカルの更新ツールなし) | 40個。update_database と check_update_status を含む |
| データの鮮度 | 毎晩(自動) | 手動 |
| オフライン利用 | 不可 | 可 |
| 必要なもの | Claude、ChatGPT、または Gemini CLI(下記のプランを参照) | 任意の MCP クライアント |
まずはリモートサーバーをご利用ください。オフラインアクセスが必要な場合にのみ、ローカルに切り替えてください。
オプション A:リモートサーバー(推奨)
ホストされている MCP サーバーに直接接続します。データのダウンロードもローカルデータベースも不要で、1,050,000 件以上の判決にすぐアクセスできます。
ホストサーバーで記録される内容。 クエリはログに記録されます。ツール、パラメーター(クエリテキストを含む)、タイムスタンプ、クライアントのクラス、定期的に変更されるセッション識別子が記録されます。また、クエリテキストは、検索の改善と独自モデルのトレーニングに使用する、アクセス制限付きの非公開研究アーカイブに無期限で保存されます。クエリに IP アドレスが保存されることはありません。アカウントやログインもなく、セッション識別子は接続のたびに変わります。5 言語での詳細については、**プライバシーに関するお知らせ**をご覧ください。クエリが機密情報である場合、またはクライアントに代わってクエリを送信する場合は、以下のオプション B を使用してコーパスをローカルで実行してください。データがマシンの外に出ることはありません。
Claude.ai / Claude Desktop(最も簡単):
- Settings → Connectors を開きます
- "Add custom connector" をクリックします
https://mcp.opencaselaw.chを貼り付けます- Add をクリックします
ブラウザー(claude.ai)とデスクトップアプリで手順は同じです。Node.js、設定ファイル、ダウンロードは不要です。
Pro、Max、Team、Enterprise プランで利用できます。無料プランの場合は、Claude Code または手動 JSON 設定を使用してください。
Claude Code:
claude mcp add swiss-caselaw --transport sse https://mcp.opencaselaw.ch
代替方法:手動での JSON 設定(カスタムコネクタを利用できない場合)
claude_desktop_config.json に追加します(Node.js が必要です):
{
"mcpServers": {
"swiss-caselaw": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.opencaselaw.ch"]
}
}
}
保存した後、Claude Desktop を再起動します。
ChatGPT:
- Settings → Apps → Advanced settings を開き、Developer mode を有効にします
- Create app をクリックし、名前に
Swiss Caselawを入力して、https://mcp.opencaselaw.ch/sseを貼り付けます。認証:なし - 任意のチャットで + → Developer mode をクリックし、Swiss Caselaw を選択します
Plus、Pro、Team、Enterprise、Edu プランで利用できます。GPT-5.3 での使用を推奨します(GPT-5.4 は現在、MCP ツールの呼び出しをサポートしていません)。
Gemini CLI:
~/.gemini/settings.json に追加します:
{
"mcpServers": {
"swiss-caselaw": {
"url": "https://mcp.opencaselaw.ch"
}
}
}
保存した後、Gemini CLI を再起動します。アカウントプランは不要です。Gemini CLI は無料です。
Google ADK(Agent Development Kit):
すべてのツールにアクセスできる Gemini 搭載エージェントを構築します:
from google.adk.agents import LlmAgent
from google.adk.tools import MCPToolset
from mcp.client.sse import SseConnectionParams
agent = LlmAgent(
model="gemini-3.1-pro",
name="swiss_law_agent",
instruction="You are a Swiss legal research assistant.",
tools=[
MCPToolset(
connection_params=SseConnectionParams(
url="https://mcp.opencaselaw.ch/sse",
),
),
],
)
Google Gen AI SDK の例やその他すべてのプラットフォームについては、MCP のセットアップガイド全文をご覧ください。
すべてのプラットフォームの詳細な手順については、**MCP のセットアップガイド全文**をご覧ください。
update_databaseとcheck_update_statusツールはローカルサーバーでのみ利用できます。リモートのデータセットは毎晩自動的に更新されます。
オプション B:ローカルサーバー(オフラインアクセス)
データベースのコピー(ディスク容量約 65 GB)を使用して、MCP サーバーをローカルで実行します。オフラインでアクセスでき、データを完全に管理できます。
Claude Code でのセットアップ
Claude Code は、ターミナルで Claude を使用するための Anthropic の CLI です。
ステップ 1. このリポジトリをクローンします:
git clone https://github.com/jonashertner/opencaselaw.git
cd caselaw-repo-1
ステップ 2. 仮想環境を作成し、MCP サーバーの依存関係をインストールします:
python3 -m venv .venv
# macOS / Linux
source .venv/bin/activate
pip install mcp pydantic huggingface-hub pyarrow fastapi
# Windows (PowerShell)
.venv\Scripts\Activate.ps1
pip install mcp pydantic huggingface-hub pyarrow
ステップ 3. Claude Code に MCP サーバーを登録します:
# macOS / Linux
claude mcp add swiss-caselaw -- /path/to/caselaw-repo-1/.venv/bin/python3 /path/to/caselaw-repo-1/mcp_server.py
# Windows
claude mcp add swiss-caselaw -- C:\path\to\caselaw-repo-1\.venv\Scripts\python.exe C:\path\to\caselaw-repo-1\mcp_server.py
.venv 内の Python バイナリには絶対パスを指定してください。そうすることで、Claude Code をどのディレクトリから実行しても、サーバーが常に依存関係を見つけられます。
ステップ 4. Claude Code を再起動して、最初の検索を実行します。
初回使用時に、サーバーは自動的に次の処理を行います:
- HuggingFace からすべての Parquet ファイル(約 7 GB)を
~/.swiss-caselaw/parquet/にダウンロードします - ローカルの SQLite FTS5 全文検索インデックスを
~/.swiss-caselaw/decisions.dbに構築します(約 58 GB)
マシンと接続環境によって、30~60 分かかります。この処理は一度だけ行われ、その後はローカルデータベースに対して検索が即座に実行されます。
必要なディスク容量の合計: ~/.swiss-caselaw/(macOS/Linux)または %USERPROFILE%\.swiss-caselaw\(Windows)に約 65 GB。
Claude Desktop を使ったセットアップ
手順を追った説明(macOS + Windows)は、Claude Desktop のセットアップガイド をご覧ください。
簡易版 — claude_desktop_config.json に以下を追加します。
{
"mcpServers": {
"swiss-caselaw": {
"command": "/path/to/caselaw-repo-1/.venv/bin/python3",
"args": ["/path/to/caselaw-repo-1/mcp_server.py"]
}
}
}
設定ファイルの場所:~/Library/Application Support/Claude/claude_desktop_config.json(macOS)または %APPDATA%\Claude\claude_desktop_config.json(Windows)。Windows では、代わりに .venv\\Scripts\\python.exe を使用してください。
MCP 互換クライアントであれば、同じ command + args パターンで動作します。
データを最新の状態に保つ
データセットは毎日更新されます。最新の決定事項を取得するには、Claude に update_database ツールを実行するよう依頼するか、明示的に呼び出してください。これにより、HuggingFace から Parquet ファイルが再ダウンロードされ、ローカルデータベースが再構築されます。
SQLite スナップショットのアーティファクト
HuggingFace データセットでは、ブートストラップツール用に、圧縮された SQLite ベーススナップショット全体が artifacts/sqlite/snapshots/ に公開される場合もあります。そのメタデータは artifacts/manifest.json の snapshot に格納されています。この値が null の場合、利用側は上記の Parquet 再構築手順にフォールバックしてください。
このスナップショットは、ローカルの MCP サーバーのブートストラップを目的としています。artifacts/manifest.json をダウンロードし、snapshot.sqlite_zst.path を取得して、snapshot.sqlite_zst.sha256 を検証し、decisions.db.tmp に展開します。次に、SQLite の行数とスキーマを簡単に確認してから、decisions.db にアトミックに移動します。その後、より新しい artifacts/sqlite/deltas/*.sqlite.zst エントリを、差分更新に対応したツールで適用できます。
スナップショットを手動でブートストラップする場合:
pip install zstandard
python - <<'PY'
import hashlib
import json
import os
import sqlite3
import urllib.request
from pathlib import Path
import zstandard as zstd
base = "https://huggingface.co/datasets/voilaj/swiss-caselaw/resolve/main"
data_dir = Path(os.environ.get("SWISS_CASELAW_DIR", Path.home() / ".swiss-caselaw")).expanduser()
data_dir.mkdir(parents=True, exist_ok=True)
with urllib.request.urlopen(f"{base}/artifacts/manifest.json") as r:
manifest = json.load(r)
snapshot = manifest.get("snapshot")
if not snapshot:
raise SystemExit("No SQLite snapshot is advertised; use update_database instead.")
meta = snapshot["sqlite_zst"]
tmp_db = data_dir / "decisions.db.tmp"
final_db = data_dir / "decisions.db"
class HashingReader:
def __init__(self, raw, digest):
self.raw = raw
self.digest = digest
def read(self, size=-1):
data = self.raw.read(size)
if data:
self.digest.update(data)
return data
h = hashlib.sha256()
with urllib.request.urlopen(f"{base}/{meta['path']}") as src, tmp_db.open("wb") as dst:
zstd.ZstdDecompressor().copy_stream(HashingReader(src, h), dst)
if h.hexdigest() != meta["sha256"]:
tmp_db.unlink(missing_ok=True)
raise SystemExit("SHA-256 verification failed")
con = sqlite3.connect(tmp_db)
try:
rows = con.execute("SELECT COUNT(*) FROM decisions").fetchone()[0]
con.execute("SELECT decision_id FROM decisions LIMIT 1").fetchone()
finally:
con.close()
expected = snapshot.get("rows")
if expected is not None and rows != expected:
raise SystemExit(f"Row-count check failed: got {rows}, expected {expected}")
tmp_db.replace(final_db)
print(f"Installed {final_db} with {rows:,} decisions")
PY
ローカルデータベースの仕組み
~/.swiss-caselaw/
├── parquet/ # Downloaded Parquet files from HuggingFace (~7 GB)
│ └── data/
│ ├── bger.parquet
│ ├── bvger.parquet
│ └── ... # 100 files, one per court
├── decisions.db # SQLite FTS5 search index (~58 GB)
├── reference_graph.db # Case citations + statute links (~3.5 GB)
└── statutes.db # Federal law articles from Fedlex (~610 MB)
すべてのデータはお使いのマシン上に保存されます。検索中に API 呼び出しは行われず、MCP サーバーがローカルの SQLite データベースを直接照会します。
データベースの構造。 decisions.db は、次の 2 つのテーブルを持つ単一の SQLite ファイルです。
-
decisions— 判決ごとに 1 行を持つメインテーブルです。検索対象のフィールドに加えて、json_data(レコード全体のデータ)と、重複を考慮した検索に使うcanonical_keyを含む 24 列を保持します。フィルター付きのクエリを高速化するため、court、canton、decision_date、language、docket_number、chamber、decision_typeにインデックスが設定されています。 -
decisions_fts—decisionsの 7 つのテキスト列(court、canton、docket_number、language、title、regeste、full_text)を反映する FTS5 仮想テーブルです。FTS5 はこれらの列に転置インデックスを構築し、100 万件以上の判決を対象とした全文検索を 1 秒未満で実行できます。トークナイザーにはunicode61 remove_diacritics 2を使用し、ドイツ語、フランス語、イタリア語、ロマンシュ語のアクセント付き文字を処理します。挿入・更新・削除のトリガーによって、FTS インデックスはメインテーブルと自動的に同期されます。
約 58 GB になる理由。 96 万 2,000 件を超える裁判所判決の全文は、1 件あたり平均約 15 KB です。FTS5 の転置インデックスには、一意のトークンごとに、その位置と出現する列の情報が追加されるため、容量が増えます。これは既知のトレードオフです。大規模なテキストコーパスの FTS5 インデックスは元データより大幅に大きくなりますが、外部インフラストラクチャなしで即座にランキング検索を実行できます。
検索パイプライン。 検索を実行すると、サーバーは次の処理を行います。
-
クエリの意図を検出します — 事件番号検索(
6B_1234/2023)、明示的な FTS 構文(Mietrecht AND Kündigung)、または自然言語(decisions on tenant eviction)を判別します。 -
複数の FTS5 クエリ戦略を実行します — 自然言語のクエリでは、サーバーが複数の FTS クエリのバリエーション(AND、OR、フレーズ、regeste/title に絞ったフィールド検索、多言語の用語展開)を生成し、順に実行します。各戦略でランキングされた候補セットが生成されます。明示的な構文(AND/OR/NOT、引用符で囲まれたフレーズ、列フィルター)の場合は、生のクエリを最初に試します。
-
RRF で候補を統合します — すべての戦略の検索結果を、Reciprocal Rank Fusion を使って統合します。各候補のスコアは、その候補が返されたすべての戦略における
1/(k + rank)の加重合計です。複数の戦略で見つかった判決はスコアが加算されます。 -
シグナルスコアで再ランキングします — 上位候補を、次の要素を組み合わせた複合スコアで再ランキングします。
- BM25 スコア(FTS5 によるスコア。列ごとのカスタム重みを使用:
full_text1.2、regeste5.0、title6.0 — 判決本文よりも要旨とタイトルを大きく重み付けします) - タイトル(3.0 倍)、regeste(2.2 倍)、スニペット(0.8 倍)における用語の網羅率
- タイトル/regeste におけるフレーズ一致(1.8 倍)
- 事件番号の一致 — 完全一致(6.0 倍)または部分一致(2.0 倍)
- 法令/引用グラフのシグナル — クエリに条文(例:「Art. 8 BV」)が含まれる場合、その規定を引用する判決のスコアが加算されます。
- 裁判所の事前スコア — たとえば、庇護に関するクエリでは BVGer の判決のスコアが加算されます。
- BM25 スコア(FTS5 によるスコア。列ごとのカスタム重みを使用:
-
最適な抜粋を選択します — 各検索結果について、サーバーが全文から最も関連性の高い箇所を探し、スニペットとして返します。
利用可能なツール
特記がない限り、リモートとローカルの両方で利用できます。
| ツール | 説明 |
|---|---|
search_decisions | フィルター(裁判所、州、言語、日付範囲、部)を使った全文検索 |
get_decision | 事件番号または ID を指定して、個別の判決を取得します。引用グラフの件数(引用された数/引用している数)も含まれます。 |
list_courts | 各裁判所の判決件数を含む、すべての裁判所の一覧を表示します |
get_statistics | 裁判所、州、年ごとの集計統計 |
find_citations | 信頼度スコアとともに、判決が引用しているものと、その判決を引用しているものを表示します |
find_appeal_chain | 上訴の経路(Instanzenzug)をたどり、前審と後審を表示します |
find_leading_cases | トピックまたは法令について、最も多く引用されている判決を検索します |
analyze_legal_trend | 法令またはトピックについて、年ごとの判決件数を表示します |
draft_mock_decision | 事実関係に基づき、判例法と法令への参照を踏まえた調査専用の模擬判決の概要を作成します。結論を出す前に確認の質問をします |
get_case_brief | あらゆる事件について、regeste、主要な Erwägungen、引用法令、引用の効力を含む構造化された要約を作成します |
get_doctrine | 法令の条文または法律概念から、主要判例のランキングと法理の推移を提示します |
generate_exam_question | 法的トピックから、Fallbearbeitung の練習用に分析を隠した実際の BGE の事実関係を提示します |
get_law | SR 番号/略称と任意の州を指定して、連邦法または州法を検索します。ローカルミラーから条文全文を返します(連邦法は Fedlex、州法は cantonal_laws.db。22 州はポータルから直接スクレイピングし、残りの 4 州は LexFind の PDF 抽出を使用) |
search_laws | BM25 順位を交互に織り交ぜて検索する、連邦法と州法を統合した FTS5 検索です。特定の管轄区域を指定するには canton=、または jurisdiction='federal'/'cantonal' で絞り込みます |
get_commentary | OnlineKommentar.ch(CC-BY-4.0)から特定の連邦法条文に関する学術的な注釈を取得します |
search_commentaries | 19 の連邦法を対象とする OnlineKommentar.ch の 362 件の法律注釈を全文検索します |
search_legislation | LexFind を利用して、連邦法と州法を対象に法令を検索します。fetch_top_n_texts=N を指定すると、上位 N 件の結果に条文全文を追加して、1 回の呼び出しで返します |
get_legislation | あらゆる連邦法または州法のメタデータと条文全文を取得します。ローカル優先で、statutes.db → cantonal_laws.db → LexFind API の順にフォールバックします |
browse_legislation_changes | 州または連邦レベルごとの最近の改正情報を表示します(ライブ LexFind API を使用。ローカルミラーは使用しません) |
update_database | HuggingFace から最新の Parquet ファイルを再ダウンロードし、ローカルデータベースを再構築します (ローカルのみ) |
check_update_status | 実行中のデータベース更新の進行状況を確認します (ローカルのみ) |
引用の完全性を確保するツールキット(ハルシネーション対策)
OpenCaseLaw はスイス法の引用を閉じたコーパスの問題として扱います。LLM が記述するすべての参照は、約 105 万件のレコードを収録したコーパスと Fedlex の法令ミラー内の実在するエントリーに解決されるか、解決されないかのどちらかです。MCP サーバーには、この契約をエンドツーエンドで適用するための 4 つのツールからなるツールキットが含まれています。
| ツール | 目的 |
|---|---|
cite | スイスの引用に対する標準的な citation_string と canonical_url を構築します。引用が捏造されている場合は exists=false と close_matches を返します。LLM は自分で引用を組み立てるのではなく、返された文字列をそのまま転記することを求められます。 |
check_claim_support | 主張ごとに Sonnet が判定します。(claim、decision_id、任意の pinpoint)を受け取り、原文の Erwägung テキストに照らして supports: yes / partial / no / contradicts / unrelated を返します。検索を実行する Haiku とは異なるモデルファミリー(Sonnet)を使うため、検証時に検索エラーが再び持ち込まれません。 |
attest_response | 最終回答を公開する前に 1 回実行する最終監査です。LLM の草稿に対し、最大 5 つのチェックを実行します。 ① 判例 — すべての BGE/BGer/BVGer/BStGer/BPatGer/MKGE の参照が実在し、すべての pinpoint が解決されること。 ② 法令 — すべての Art. X LAW 参照が statutes.db 内で解決されること。③ 引用 — 30 文字以上のすべての "…" が、引用元(判決または法令)に原文どおり含まれていること。④ 日付 — 引用に隣接するすべての vom DD.MM.YYYY が、保存されている判決日と一致すること。⑤ 根拠の確認( audit_grounding=true でオプトイン)— 検証済みの引用ごとに、独立した Sonnet の判定者が、引用元が LLM の結び付けた命題を実際に裏付けているか確認します。検証済みの引用すべてを Markdown リンクで囲んだ、原文のまま公開できる linked_text を返します。 |
get_erwaegung / get_regeste / get_law / get_materialien / get_commentary | 原文テキストの提供元です。LLM が直接引用を許可されている唯一の情報源です。 |
このアーキテクチャは、実測された法務 LLM の 2 種類の失敗を防ぎます。
- ハルシネーション(Dahl、Magesh、Suzgun、Ho、Large Legal Fictions、Stanford RegLab、2024 — Journal of Legal Analysis):汎用 LLM に対する法務関連の質問の 58~88 % で、少なくとも 1 件の権威ある情報源が捏造されました。商用の法律 RAG ツールを対象とした Stanford RegLab の追跡調査(Magesh ほか、Hallucination-Free?、2024)では、17~33 % が測定されました。→ 監査① ② ③ ④で検出します。
- 推論エラー(Butler、Butler、Isaacus、Legal RAG Bench、2026 年 3 月):引用は実在し、情報源も検索されていますが、引用に結び付けられた命題は、引用テキストによって実際には裏付けられていません。→ 監査⑤で検出します。
完全なサーバープロンプト(R1~R8)にはこれらのルールが組み込まれているため、接続するすべてのクライアント(Claude、ChatGPT、Cursor、Gemini、Copilot Studio)が自動的にこの契約を引き継ぎます。実装については mcp_server.py、回帰テストスイートについては tests/web/test_attest_audits.py、一般向けの解説については opencaselaw.ch の検証セクション を参照してください。
このアーキテクチャのエンドツーエンドの性能は、Swiss Legal RAG Bench で測定しています。Butler と Butler の Legal RAG Bench の方法論をモデルにしたベンチマークで、連邦法に関するドイツ語/フランス語/イタリア語の質問を対象とし、エラーをハルシネーション/検索/推論の各要素に分類します。v0.1 のベースライン(稼働中の OpenCaseLaw + Claude Sonnet 4.6、10 件の質問):正確性 100 %、根拠の確かさ 90 %、検索精度 70 %。
クエリの例
リモートサーバーとローカルサーバーのどちらでも使えます。
> Search for BGer decisions on Mietrecht Kündigung from 2024
> What did the BVGer rule on asylum seekers from Eritrea?
> Show me the full text of 6B_1234/2023
> How many decisions does each court in canton Zürich have?
> Find decisions citing Art. 8 BV
> What are the leading cases on Art. 8 EMRK?
> Show me the citation network for BGE 138 III 374
> How has Mietrecht jurisprudence evolved over time?
> Show me Art. 41 OR (statute lookup)
> Search for statute provisions about Verjährung
> Trace the appeal chain for 5A_234/2026
> Explain BGE 133 III 121 to me
> What are the leading cases on Art. 41 OR and how has the doctrine evolved?
> Give me a practice case on Haftpflichtrecht
> Search for cantonal data protection laws
> Show me the details of SR 220 (Obligationenrecht)
> What legislation changed recently in Zürich?
AI が MCP ツールを自動的に呼び出します。検索結果がインラインで表示され、特定の判決について追加の質問をできます。
引用グラフのツール
4 つのツールで参照グラフを利用できます。判決から判決への解決済み引用エッジは 965 万件(抽出された引用は 1,000 万件)、法令への参照は 1,240 万件です。これらのツールにはグラフデータベース(output/reference_graph.db)が必要です。利用できない場合、エラーにはならず、代わりにメッセージを返します。
find_citations — 判決を指定し、そこからの引用(参照先)と、そこへの引用(参照元)を表示します。解決済みの引用には、対象判決のメタデータと信頼度スコアが含まれます。解決できない参照(データセットに含まれない古い判決など)は、元の参照テキストとともに表示されます。
> Show me the citation network for BGE 138 III 374
## Outgoing (13 — what this decision cites)
1. BGE 136 III 365 (2010-01-01) [bge] conf=0.98 mentions=1
2. BGE 133 III 189 (2007-01-01) [bge] conf=0.93 mentions=1
...
## Incoming (13,621 — what cites this decision)
1. 5A_234/2026 (2026-02-19) [bger] conf=0.92 mentions=2
2. 5A_117/2026 (2026-01-30) [bger] conf=0.88 mentions=1
...
パラメーター:decision_id(必須)、direction(both/outgoing/incoming)、min_confidence(0~1、デフォルトは 0.3)、limit(デフォルトは 50、最大 200)。
find_appeal_chain — 判決の上訴経路(Instanzenzug)をたどります。前審(下級裁判所)と後審(上級裁判所への上訴)を表示し、手続きの全経路(例:Bezirksgericht → Obergericht → Bundesgericht)を再構成します。
パラメーター:decision_id(必須)、min_confidence(0~1、デフォルトは 0.3)。
find_leading_cases — 他の判決からの引用数に基づいて、最も多く引用されている判決をランキング形式で検索します。法令(法令コードと条文)、テキストクエリ、裁判所、期間で絞り込めます。
> What are the leading cases on Art. 8 EMRK?
1. BGE 135 I 143 (2009) — 3,840 citations
Regeste: Anspruch auf Aufenthaltsbewilligung...
2. BGE 130 II 281 (2004) — 3,155 citations
Regeste: Familiennachzug; gefestigtes Anwesenheitsrecht...
パラメーター:query(任意のテキスト)、law_code + article(任意の法令)、court、date_from、date_to、limit(デフォルトは 20、最大 100)。query または law_code のいずれかを指定することを推奨します。フィルターを指定しない場合は、全体で最も多く引用されている判決を返します。
analyze_legal_trend — トピックまたは法令に関する判例法理が時間とともにどのように変化したかを、年ごとの判決件数で表示します。件数と視覚的な棒グラフを含む表を返します。
> How has Art. 29 BV jurisprudence evolved?
**Filter:** Art. 29 BV
**Total:** 34,669 decisions
Year Count Bar
2000 275 █████
2005 733 ████████████
2010 1,028 █████████████████
2015 1,536 ██████████████████████████
2020 1,896 ████████████████████████████████
2025 2,400 ████████████████████████████████████████
パラメーター:query(任意のテキスト)、law_code + article(任意の法令)、court、date_from、date_to。query または law_code のいずれかが必須です。
法令検索ツール(ローカル、連邦+州)
2 つのツールで、ローカルミラーからスイスの法令本文に直接アクセスできます。連邦と州の両方を対象としており、条文単位の FTS5 インデックスとサブミリ秒での検索に対応しています。
- 連邦: Fedlex の SPARQL エンドポイントから取得した、ドイツ語・フランス語・イタリア語それぞれ 5,525 件の法律、約 133,359 件の条文を、毎月
statutes.dbにミラーリングしています。ドイツ語、フランス語、イタリア語で統合された連邦法令をすべて網羅しています。 - 州: 2 つの方法で取得した 15,600 件の法律、361,430 件の条文を
cantonal_laws.dbに格納しています。- 公式ポータルから直接スクレイピング(主な方法) — 公式法令集が LexWork、SIL、ZH OpenData、または TI Raccolta delle Leggi のプラットフォームで公開されている 22 州(AG、AI、AR、BE、BL、BS、FR、GE、GL、GR、LU、NE、NW、OW、SG、SH、SO、TG、TI、VS、ZG、ZH)が対象です。HTML をそのまま解析するため、PDF 抽出も OCR も行わず、条文単位のクリーンなデータを取得できます。
- LexFind の PDF フォールバック — 直接スクレイピングに未対応の 4 州(JU、SZ、UR、VD)が対象です。LexFind.ch の PDF を PyMuPDF で抽出し、条文ごとに分割します。BE/FR/VS/GR については、第 2 言語でもバイリンガル解析を行います。
- 連邦テーブルと統合し、SQLite FTS5 で検索します。
get_law — SR 番号または略称でスイスの法律(連邦または州)を検索します。オプションで特定の条文の全文を取得できます。
> Show me Art. 8 BV
# BV — SR 101
**Bundesverfassung der Schweizerischen Eidgenossenschaft vom 18. April 1999**
### Art. 8 — Rechtsgleichheit
1 Alle Menschen sind vor dem Gesetz gleich.
2 Niemand darf diskriminiert werden, namentlich nicht wegen der Herkunft, ...
> Show me Art. 1 of the Zurich Hundegesetz
get_law(canton="ZH", sr_number="554.5", article="1")
パラメーター:sr_number または abbreviation(少なくとも一方が必須)、article(省略可 — 省略すると条文一覧全体を表示)、language(de/fr/it、デフォルトは de)、canton(デフォルトは CH。州法を検索する場合は ZH、BE などを指定)。
search_laws — スイスのすべての法令条文を対象に、連邦と州を横断して FTS5 検索します。各コーパス内で BM25 による順位付けを行い、順位を交互に組み合わせることで、どちらの管轄区域の結果も表示します。
> Search for statute provisions about Verjährung
1. [CH] Art. 130 OR (SR 220): Die Verjährung beginnt mit der Fälligkeit der Forderung...
2. [ZH] § 19 Kirchgemeindenreglement (SR 182.60): ... Verjährungsbestimmungen ...
3. [CH] Art. 132 OR (SR 220): Bei der Berechnung der Frist ist der Tag...
パラメーター:query(必須、FTS5 構文)、sr_number(省略可 — 特定の連邦法を指定。連邦のみの検索になります)、canton(省略可 — 1 つの州に絞り込みます。連邦のみの場合は CH)、jurisdiction(all/federal/cantonal、デフォルトは all)、language(de/fr/it)、limit(1~50)。
法令の発見ツール(LexFind を利用)
さらに 3 つのツールでは、ローカルミラーだけでは不十分な場合に備えて、稼働中の LexFind API をローカルミラーと組み合わせています。更新サイクルの合間に公開された新しいバージョン、全バージョン履歴、最近の変更フィードを確認できます。これらはより広範な法令発見向けです。「現行の本文を取得して」という通常のクエリには、get_law/search_laws のほうが高速で信頼性があります。
search_legislation — スイスの法令を対象に、必要に応じて 1 回の呼び出しで全文を補完しながら、幅広く検索します。連邦法か州法かが分からない場合や、自然言語によるワークフローを 1 回の呼び出しで実行したい場合に便利です。
> Search for the Bernese dog act with full text
search_legislation(query="Hundegesetz", canton="BE", fetch_top_n_texts=2)
→ returns top 2 matches with full_text_preview + sample_articles inline,
no follow-up get_legislation call needed.
パラメーター:query(必須)、canton(省略可 — CH、ZH、BE など)、active_only(デフォルトは true)、search_in_content(デフォルトは false — タイトル/キーワードを検索します。法令本文を検索する場合は true を指定)、language(de/fr/it)、limit(1~60、デフォルトは 20)、fetch_top_n_texts(0~10、デフォルトは 0 — N を指定すると、上位 N 件の結果に解析済みの条文全文を追加します)。
get_legislation — 特定の法令について、メタデータ、バージョン履歴、公式情報源(Fedlex、州のポータル)へのリンクなどの詳細を取得します。
> Show me the Obligationenrecht on LexFind
SR 220 — Bundesgesetz betreffend die Ergänzung des Schweizerischen
Zivilgesetzbuches (Fünfter Teil: Obligationenrecht)
Entity: Bund (CH) | Category: Gesetz | Keywords: OR
In force since: 01.01.2026
Sources:
DE: https://www.fedlex.admin.ch/eli/cc/27/317_321_377/de
FR: https://www.fedlex.admin.ch/eli/cc/27/317_321_377/fr
パラメーター:lexfind_id(検索結果から指定)、または systematic_number と canton(例:"220" と "CH")、include_versions(デフォルトは false)、language(de/fr/it)。
browse_legislation_changes — 州または連邦レベルの最近の法令改正を確認します。新しい法律、改正、廃止について、日付とリンクを表示します。
> What legislation changed recently in Zürich?
1. [01.03.2026] version — Vollzugsverordnung zur Finanzverordnung (SR 181.131)
2. [01.03.2026] new — Studienordnung für den Masterstudiengang... (SR 414.253.125)
3. [01.03.2026] version — Organisationsverordnung der Finanzdirektion (SR 172.110.3)
パラメーター:canton(デフォルトは CH)、language(de/fr/it)。
法学学習ツール
3つのツールが、判例の理解、法理の理解、試験でのあてはめ演習という、学生の3つの主要な学習ワークフローに対応した法学学習をサポートします。ツールは詳細な構造化データを返し、Claude がチューターとして、教育的な内容をすべて動的に生成します。
get_case_brief — 任意の判例参照(「BGE 133 III 121」、事件番号、または decision_id)から、構造化された判例要約を返します。レゲステ、事実関係(Sachverhalt)、主要な番号付き判示(Erwägungen)、主文(Dispositiv)、条文の抜粋を含む引用法令、引用の状況(被引用数/引用数)、および引用元・引用先の判例上位一覧を返します。
get_doctrine — 法令の条項(「Art. 41 OR」)または法的概念(「culpa in contrahendo」、「Tierhalterhaftung」)から、法理の概要を返します。引用数順に並べた主要判例、法理の変遷を示す時系列、および該当する場合は条文を返します。
generate_exam_question — 法分野(「Haftpflichtrecht」、「Art. 41 OR」、「Mietrecht」)から、実際の事例問題(Fallbearbeitung)を生成します。主要な BGE を選び、匿名化された事実関係(Sachverhalt)を問題として返すとともに、非表示の分析(適用法令、法的判断基準、正しい結論)を用意します。学生はあてはめを書いた後、Claude に分析を開示して比較とフィードバックを依頼できます。同じ判例の繰り返しを避けるには、exclude_ids を渡してください。
draft_mock_decision では Fedlex の URL を任意で使用でき、取得した条文の抜粋を
~/.swiss-caselaw/fedlex_cache.json にキャッシュします(SWISS_CASELAW_FEDLEX_CACHE で設定可能です)。
検索品質のベンチマーク
固定のゴールデンクエリセットを使って、検索の関連性を継続的に評価できます。
python3 benchmarks/run_search_benchmark.py \
--db ~/.swiss-caselaw/decisions.db \
-k 10 \
--json-output benchmarks/latest_search_benchmark.json
指標:MRR@k、Recall@k、nDCG@k、Hit@1
リポジトリには、凍結されたオフラインのベースライン benchmarks/search_benchmark_2026-03-19_offline_full.json も含まれています。1,078,177 行のローカル decisions.db に対する100クエリ全体の実行では、MRR@10 = 0.4697、Recall@10 = 0.4958、nDCG@10 = 0.5250、Hit@1 = 0.33 が記録されました。これは、ホスト型デプロイメント環境が完全に整った状態でのスコアではなく、再現可能なオフラインのベースラインとして扱ってください。
最低品質ゲートを適用できます(失敗時はゼロ以外の終了コードを返します)。
python3 benchmarks/run_search_benchmark.py \
--db ~/.swiss-caselaw/decisions.db \
-k 10 \
--min-mrr 0.50 \
--min-recall 0.75 \
--min-ndcg 0.85
参照グラフの構築(任意)
法令・引用に基づく再ランキングを行うには、ローカルのグラフデータベースを構築します。
python3 search_stack/build_reference_graph.py \
--source-db ~/.swiss-caselaw/decisions.db \
--courts bger,bge,bvger \
--db output/reference_graph.db
次に、サーバーからそのデータベースを参照するように設定します。
export SWISS_CASELAW_GRAPH_DB=output/reference_graph.db
グラフのシグナルはデフォルトで有効です。無効にするには、SWISS_CASELAW_GRAPH_SIGNALS=0 を設定します。
法令データベースの構築(任意)
法令の検索(get_law、search_laws)を行うには、Fedlex の法令データベースを構築します。
# Download the top 100 most-cited federal laws from Fedlex
python3 -m scrapers.fedlex --top 100
# Build the SQLite FTS5 statutes database
python3 -m search_stack.build_statutes_db
次に、データディレクトリにコピーします。
cp output/statutes.db ~/.swiss-caselaw/
または、パスを明示的に設定します。
export SWISS_CASELAW_STATUTES_DB=output/statutes.db
2. データセットのダウンロード
完全なデータセットは HuggingFace で Parquet ファイルとして公開されています。裁判所ごとに1ファイルで、各判決には完全な判決文を含む34個のフィールドがあります。
機械処理可能なアーティファクトのメタデータは artifacts/manifest.json で公開されています。日次の Parquet/SQLite 差分に加えて、Parquet から再構築せずにローカルの FTS5 データベースを初期化したいツール向けに、任意の完全圧縮 SQLite スナップショット artifacts/sqlite/snapshots/<date>.decisions.sqlite.zst がマニフェストに記載される場合があります。
Python の場合(datasets ライブラリ)
ステップ1。 ライブラリをインストールします。
pip install datasets
ステップ2。 データを読み込みます。
from datasets import load_dataset
# Load a single court (~170k decisions, ~800 MB)
bger = load_dataset("voilaj/swiss-caselaw", data_files="data/bger.parquet")
# Load all courts (~900K decisions, ~6.5 GB download)
ds = load_dataset("voilaj/swiss-caselaw", data_files="data/*.parquet")
ステップ3。 データを確認します。
# Print a single decision
decision = bger["train"][0]
print(decision["docket_number"]) # "6B_1/2024"
print(decision["decision_date"]) # "2024-03-15"
print(decision["language"]) # "de"
print(decision["regeste"][:200]) # First 200 chars of the headnote
print(decision["full_text"][:500]) # First 500 chars of the full text
pandas の場合
import pandas as pd
# Load one court
df = pd.read_parquet("hf://datasets/voilaj/swiss-caselaw/data/bger.parquet")
# Filter by date
df_recent = df[df["decision_date"] >= "2024-01-01"]
print(f"{len(df_recent)} decisions since 2024")
# Filter by language
df_french = df[df["language"] == "fr"]
# Group by legal area
df.groupby("legal_area").size().sort_values(ascending=False).head(10)
直接ダウンロード
各裁判所のデータは1つの Parquet ファイルです。直接ダウンロードできます。
https://huggingface.co/datasets/voilaj/swiss-caselaw/resolve/main/data/bger.parquet
https://huggingface.co/datasets/voilaj/swiss-caselaw/resolve/main/data/bvger.parquet
https://huggingface.co/datasets/voilaj/swiss-caselaw/resolve/main/data/zh_gerichte.parquet
...
ファイルの一覧:huggingface.co/datasets/voilaj/swiss-caselaw/tree/main/data
3. REST API
何もインストールせずに、HTTP 経由でデータセットをクエリできます。HuggingFace Datasets Serverを使用します。
行を取得する:
curl "https://datasets-server.huggingface.co/rows?dataset=voilaj/swiss-caselaw&config=default&split=train&offset=0&length=5"
データセット情報を取得する:
curl "https://datasets-server.huggingface.co/info?dataset=voilaj/swiss-caselaw"
SQL で検索する(DuckDB エンドポイント):
curl -X POST "https://datasets-server.huggingface.co/search?dataset=voilaj/swiss-caselaw&config=default&split=train" \
-d '{"query": "SELECT docket_number, decision_date, language FROM data WHERE court = '\''bger'\'' LIMIT 10"}'
注:REST API は、HuggingFace リポジトリで設定されたデータセット(裁判所ごとの Parquet ファイル、全 34 フィールドのスキーマ)をクエリします。一括アクセスやローカルでの分析には、上記のダウンロード方法を使用してください。
4. Web UI
スイスの裁判所の判決を検索するためのローカルチャットインターフェースです。自然言語で質問すると、AI アシスタントがコーパス全体を検索し、判決を引用して回答します。
Browser (localhost:5173) → FastAPI backend → MCP server → Local SQLite FTS5 DB
すべての処理はお使いのマシン上で実行されます(選択したプロバイダーへの LLM API 呼び出しを除き、データがコンピューターの外部に送信されることはありません)。
必要なもの
| 要件 | 確認方法 | 入手先 |
|---|---|---|
| Python 3.10+ | python3 --version(macOS/Linux)または python --version(Windows) | python.org/downloads |
| Node.js 18+ | node --version | nodejs.org — LTS バージョンをダウンロード |
| LLM プロバイダー | (以下を参照) | クラウド API キーを 1 つ以上、または Ollama 経由のローカルモデル |
| ディスク空き容量約 65 GB | df -h .(macOS/Linux) | 検索インデックス用(初回実行時にダウンロードされます) |
Windows ユーザーの方へ: python.orgから Python をインストールし、インストール時に「Add Python to PATH」にチェックを入れてください。Node.js をインストールすると npm も自動的にインストールされます。
クラウドプロバイダー(少なくとも 1 つ選択するか、下記の Ollama を使用してください)
| プロバイダー | 環境変数 | API キーの入手先 | 料金 |
|---|---|---|---|
| Google Gemini | GEMINI_API_KEY | aistudio.google.com/apikey | 無料枠あり |
| OpenAI | OPENAI_API_KEY | platform.openai.com/api-keys | 新規アカウントには無料クレジットあり |
| Anthropic (Claude) | ANTHROPIC_API_KEY | console.anthropic.com | 従量課金制 |
重要: Claude Desktop または Claude Pro のサブスクリプションには API キーは含まれていません。console.anthropic.comで別途開発者アカウントを作成する必要があります。
ローカルモデル(API キー不要)
クラウド API を使いたくない場合は、Ollamaを使ってすべてをローカルで実行できます。
| モデル | インストールコマンド | ダウンロードサイズ | 必要な RAM |
|---|---|---|---|
| Qwen 2.5 (14B) | ollama pull qwen2.5:14b | 約 9 GB | 約 16 GB |
| Llama 3.3 (70B) | ollama pull llama3.3:70b | 約 40 GB | 約 48 GB |
ollama.comから Ollama をインストールし(macOS、Linux、Windows 対応)、次のコマンドを実行してください。
ollama serve # start the Ollama server (leave running)
ollama pull qwen2.5:14b # download a model (one-time)
Web UI は Ollama を自動検出し、ローカルモデルを利用可能なモデルとして表示します。
手順に沿ったセットアップ
ステップ 1. リポジトリをクローンします:
git clone https://github.com/jonashertner/opencaselaw.git
cd caselaw-repo-1
ステップ 2. Python の仮想環境を作成します:
python3 -m venv .venv
有効化します:
| OS | コマンド |
|---|---|
| macOS / Linux | source .venv/bin/activate |
| Windows (PowerShell) | .venv\Scripts\Activate.ps1 |
| Windows (cmd) | .venv\Scripts\activate.bat |
ターミナルのプロンプトが
(.venv)で始まっていれば、有効になっています。
ステップ 3. Python の依存関係をインストールします:
pip install fastapi uvicorn python-dotenv mcp pyarrow pydantic
次に、少なくとも 1 つの LLM プロバイダー SDK をインストールします:
pip install anthropic # for Claude
pip install openai # for OpenAI / GPT-4o / local models via Ollama
pip install google-genai # for Google Gemini
ヒント:
openaiパッケージは、ローカルの Ollama モデルにも使用されます(Ollama は OpenAI 互換 API を公開しています)。ローカルモデルのみを使用する場合は、pip install openaiだけで十分です。クラウド API キーは必要ありません。
ステップ 4. フロントエンドをインストールします:
cd web_ui && npm install && cd ..
ステップ 5. API キーを設定します:
cp .env.example .env
テキストエディターで .env を開き、該当する行に API キーを貼り付けます。たとえば、Gemini キーをお持ちの場合は、GEMINI_API_KEY=AI... を実際のキーに変更します。他のプロバイダーの行はそのままにしてください。空の場合は無視されます。
この手順を省略して、起動後に UI 内の Settings パネルからキーを設定することもできます。
ステップ 6. アプリを起動します:
| OS | コマンド |
|---|---|
| macOS / Linux | ./scripts/run_web_local.sh |
| Windows (PowerShell) | .\scripts\run_web_local.ps1 |
ブラウザーで http://localhost:5173 を開きます。
初回起動時の動作: MCP サーバーが HuggingFace からデータセット(約 7 GB)を自動的にダウンロードし、ローカル検索インデックス(約 58 GB)を構築します。接続速度とディスク速度によって、30~60 分かかります。進行状況はターミナルに表示されます。この初回セットアップが完了すれば、アプリはすぐに起動します。
機能
- 5 つのモデル:Claude、OpenAI、Gemini(クラウド)+ Ollama 経由の Qwen 2.5 と Llama 3.3(ローカル)
- ローカル優先の選択肢:Ollama を使ってすべてをマシン上で実行できます。クラウド API キーは不要です
- ストリーミング:応答がリアルタイムでトークンごとに表示されます
- ツール拡張チャット:AI が検索、get_decision、list_courts などを自動的に呼び出します
- 判決カード:Fedlex の条文テキストがインライン表示される、クリック可能な法令参照
- フィルター:裁判所、州、言語、期間で結果を絞り込めます
- アプリ内設定:UI から API キーと Ollama の接続を設定できます
- エクスポート:会話を Markdown、Word、PDF としてダウンロードできます
トラブルシューティング
| 問題 | 解決策 |
|---|---|
python3: command not found(Windows) | python3 の代わりに python を使用するか、「Add to PATH」にチェックを入れて Python を再インストールします |
npm: command not found | nodejs.org から Node.js をインストールします |
ModuleNotFoundError: No module named 'fastapi' | venv を有効にして(source .venv/bin/activate)、pip install ... を再実行します |
| 「No provider configured」バナー | 歯車アイコン(Settings)をクリックして API キーを貼り付けるか、Ollama を起動します |
| 初回起動時に「Database not found」と表示される | 初回ダウンロードが完了するまで待ちます(進行状況はターミナルで確認できます) |
| ポートがすでに使用中 | .env の BACKEND_PORT または FRONTEND_PORT を編集します |
| PowerShell スクリプトがブロックされる(Windows) | Set-ExecutionPolicy -Scope CurrentUser RemoteSigned を一度実行します |
高度な設定(カスタムポート、MCP サーバーのパス、タイムアウト)については、.env.example を参照してください。
各判決の内容
各判決には 34 個の構造化フィールドがあります:
主なフィールド
| フィールド | 型 | 例 | 説明 |
|---|---|---|---|
decision_id | string | bger_6B_1234_2025 | 一意のキー:{court}_{docket_normalized} |
court | string | bger | 裁判所コード(一覧) |
canton | string | CH | 連邦はCH、州はZH/BE/GE/… |
docket_number | string | 6B_1234/2025 | 公開時の事件番号 |
decision_date | date | 2025-03-15 | 判決が下された日付 |
language | string | de | de、fr、it、またはrm |
full_text | string | (全文) | 判決の全文。通常5~50ページ |
source_url | string | https://bger.ch/... | 原文への恒久的なリンク |
法的内容
| フィールド | 型 | 説明 |
|---|---|---|
regeste | string | 法的な判示事項/要約(Regeste) |
legal_area | string | 法分野(Strafrecht、Zivilrecht、…) |
title | string | 件名(Gegenstand) |
outcome | string | 結果:Gutheissung、Abweisung、Nichteintreten、… |
decision_type | string | 種類:Urteil、Beschluss、Verfügung、… |
cited_decisions | string | 引用された判決の参照情報を格納したJSON配列 |
bge_reference | string | 公開されている場合のBGE判例集の参照情報 |
abstract_de | string | ドイツ語の要旨(主にBGE) |
abstract_fr | string | フランス語の要旨 |
abstract_it | string | イタリア語の要旨 |
裁判所のメタデータ
| フィールド | 型 | 説明 |
|---|---|---|
chamber | string | 部(例:「I. zivilrechtliche Abteilung」) |
judges | string | 裁判体の構成 |
clerks | string | 裁判所書記官(Gerichtsschreiber) |
collection | string | 公式判例集の参照情報 |
appeal_info | string | 上訴の状況/後続の手続き |
技術フィールド
| フィールド | 型 | 説明 |
|---|---|---|
docket_number_2 | string | 副事件番号 |
publication_date | date | オンライン公開日 |
pdf_url | string | PDFへの直接URL |
external_id | string | 相互参照ID |
scraped_at | datetime | この判決がスクレイピングされた日時 |
source | string | データソース識別子 |
source_id | string | ソース固有のID(例:Signatur) |
source_spider | string | ソースのスパイダー/スクレイパー名 |
content_hash | string | 重複排除用のfull_textのMD5 |
has_full_text | bool | full_textが空でないかどうか |
text_length | int | full_textの文字数 |
34フィールドのParquetエクスポートスキーマ全体:export_parquet.py
網羅範囲
連邦裁判所
| 裁判所 | コード | 判決数 | 期間 | 出典 |
|---|---|---|---|---|
| 連邦最高裁判所(BGer) | bger | 約173,000 | 1996年〜現在 | bger.ch |
| BGE 主要判例 | bge | 約45,000 | 1954年〜現在 | bger.ch CLIR |
| 連邦行政裁判所(BVGer) | bvger | 約91,000 | 2007年〜現在 | bvger.ch |
| 連邦行政実務(VPB) | ch_vb | 約2,500 | 1987〜2017年 | amtsdruckschriften.bar.admin.ch(連邦公文書館。凍結済み。シリーズは2018年に終了) |
| 連邦刑事裁判所(BStGer) | bstger | 約11,000 | 2004年〜現在 | bstger.weblaw.ch |
| EDÖB(データ保護) | edoeb | 約1,200 | 1994年〜現在 | edoeb.admin.ch |
| FINMA | finma | 約1,200 | 2008〜2024年 | finma.ch |
| ECHR(スイス関連事件、BGer 公開分) | bge_egmr | 約475 | 1974年〜現在 | bger.ch CLIR |
| ECHR スイス(HUDOC) | hudoc_ch | 834 | 1959年〜現在 | HUDOC API |
| ECtHR 小法廷判決 | ecthr_chamber | 7,761 | 1960年〜現在(FR または EN) | HUDOC API |
| ECtHR 大法廷 | ecthr_grand_chamber | 514 | 1960年〜現在(FR または EN) | HUDOC API |
| ECtHR 委員会判決 | ecthr_committee | 0 — 重要度 4、対象外 | HUDOC API | |
| 軍事破棄院(MKG) | mkg | 1,244 | 1915〜2025年 | oa.admin.ch + alexandria.ch |
| 連邦特許裁判所(BPatGer) | bpatger | 約190 | 2012年〜現在 | bpatger.ch |
| 競争委員会(WEKO) | weko | 約120 | 2009年〜現在 | weko.admin.ch |
| スポーツ裁判所 | ta_sst | 約50 | 2024年〜現在 | ta-sst.ch |
| 連邦参事会 | ch_bundesrat | 約15 | 2012年〜現在 | bj.admin.ch |
州裁判所
全26州にわたる77の裁判所。判例数の多い州のコレクションは次のとおりです。
| 州 | 裁判所数 | 判決数 | 期間 |
|---|---|---|---|
| ヴォー州(VD) | 3 | 約155,000 | 1984年〜現在 |
| チューリッヒ州(ZH) | 20 | 約126,000 | 1980年〜現在 |
| ジュネーヴ州(GE) | 1 | 約116,000 | 1993年〜現在 |
| ティチーノ州(TI) | 1 | 約58,000 | 1995年〜現在 |
| ザンクト・ガレン州(SG) | 7 | 約35,000 | 2001年〜現在 |
| グラウビュンデン州(GR) | 1 | 約29,000 | 2002年〜現在 |
| バーゼル=ラント準州(BL) | 1 | 約26,000 | 2000年〜現在 |
| ベルン州(BE) | 6 | 約26,000 | 2002年〜現在 |
| アールガウ州(AG) | 18 | 約21,000 | 1993年〜現在 |
| バーゼル=シュタット準州(BS) | 3 | 約19,000 | 2001年〜現在 |
全26州を網羅:AG、AI、AR、BE、BL、BS、FR、GE、GL、GR、JU、LU、NE、NW、OW、SG、SH、SO、SZ、TG、TI、UR、VD、VS、ZG、ZH。
裁判所ごとの最新統計:ダッシュボード
仕組み
┌──────────────────────────────────────────────────────┐
│ Daily Pipeline │
│ │
Court websites ────────►│ Scrapers ──► JSONL ──┬──► Parquet ──► HuggingFace │
bger.ch │ (45 scrapers, │ │
bvger.ch │ rate-limited, ├──► FTS5 DB ───┐ │
cantonal portals │ resumable) │ ├► MCP Server │
│ └──► Graph DB ──┘ │
│ ▲ │
Fedlex (SPARQL) ───────►│ Fedlex scraper ──► XML ──► Statutes DB ─┘ │
│ │
│ 01:00 UTC scrape 04:00 UTC publish │
└──────────────────────────────────────────────────────┘
手順
-
スクレイピング(毎日 01:00 UTC) — 45 個のスクレイパーが並列で実行され、それぞれ特定の裁判所のウェブサイトまたは API を対象にします。すべてのスクレイパーにはレート制限が設定され、中断後に再開できます。すでに確認した判決を追跡し、新しいものだけを取得します。出力は裁判所ごとに 1 つの JSONL ファイルです。別の Fedlex スクレイパーが、法令データベース用の連邦法テキスト(Akoma Ntoso XML)を SPARQL 経由でダウンロードします。
-
検索インデックスの構築(04:00 UTC) — JSONL ファイルを SQLite FTS5 データベースに取り込み、全文検索を可能にします。月曜から土曜は増分モードで実行されます。バイトオフセットのチェックポイントで各 JSONL ファイルの読み取り位置を追跡するため、新たに追加された判決だけが処理されます(通常 1 分未満)。日曜は完全再構築を行い、FTS5 インデックスを圧縮してチェックポイントをリセットします(約3時間)。複数のソースに掲載されている判決は
decision_idで重複排除し、全文が最も長いバージョンを保持します。品質向上の処理で、不足しているタイトル、レジェスト、コンテンツハッシュを補完します。 -
エクスポート — JSONL ファイルを、固定の34フィールドのスキーマを持つ Parquet に変換します(裁判所ごとに 1 ファイル)。
-
アップロード — Parquet ファイルを HuggingFace にプッシュします。MCP サーバーと
datasetsライブラリは新しいデータを自動的に取り込みます。オプションのアーティファクト公開機能では、日次差分と、外部ブートストラップツール用の完全圧縮 SQLite スナップショットを含むartifacts/manifest.jsonも更新できます。 -
ダッシュボードの更新 —
stats.jsonを再生成し(直近の実行におけるスクレイパーの稼働状況も含む)、GitHub Pages にプッシュします。
ローカルでの実行(開発者向け)
スクレイパーの実行、パイプラインの構築、コードベースの変更を行う貢献者や開発者向けです。
前提条件
- Python 3.10+
- pip
インストール
git clone https://github.com/jonashertner/opencaselaw.git
cd caselaw-repo-1
python3 -m venv .venv
source .venv/bin/activate # macOS/Linux — on Windows: .venv\Scripts\Activate.ps1
pip install -e ".[all]"
PDF 解析、暗号化、FastAPI サーバーを含むすべての依存関係がインストールされます。オプションの依存関係を含めずに最小構成でインストールするには、代わりに pip install -e . を使用してください。
判決のスクレイピング
# Scrape 5 recent decisions from the Federal Supreme Court
python run_scraper.py bger --max 5 -v
# Scrape BVGer decisions since a specific date
python run_scraper.py bvger --since 2025-01-01 --max 20 -v
# Scrape a cantonal court
python run_scraper.py zh_gerichte --max 10 -v
出力は output/decisions/{court}.jsonl に書き込まれます。裁判所ごとに 1 ファイルで、1 行につき 1 つの JSON オブジェクトが格納されます。スクレイパーは取得済みのデータを記録するため(状態は state/ に保存されます)、繰り返し実行すると新しい判決のみを取得できます。
利用可能な裁判所コードは 45 個です。全リストを確認するには python run_scraper.py --list を実行するか、裁判所ごとの統計についてはダッシュボードをご覧ください。
ローカル検索データベースの構築
# Full build (reads all JSONL, optimizes FTS index — ~3h for 900K decisions)
python build_fts5.py --output output -v
# Incremental build (reads only new JSONL bytes, skips optimize — seconds)
python build_fts5.py --output output --incremental --no-optimize -v
# Full rebuild (deletes DB + checkpoint, rebuilds from scratch)
python build_fts5.py --output output --full-rebuild -v
output/decisions/ の JSONL ファイルを読み込み、output/decisions.db に SQLite FTS5 データベースを構築します。判決 90 万件すべてを処理するには約 3 時間かかり、約 58 GB のデータベースが生成されます。インクリメンタルモードではチェックポイントファイル(output/.fts5_checkpoint.json)を使用して変更のないファイルをスキップし、処理済みのバイト位置から再開します。新しい判決が少ない場合は数秒で完了します。
Parquet へのエクスポート
python export_parquet.py --input output/decisions --output output/dataset -v
JSONL ファイルを Parquet 形式に変換します(裁判所ごとに 1 ファイル)。出力先は output/dataset/ です。
データソース
| ソース | 内容 | 方法 |
|---|---|---|
| 裁判所の公式ウェブサイト | 連邦裁判所(bger.ch、bvger.ch、bstger.ch、bpatger.ch) | JSON API、構造化 HTML |
| 連邦規制機関 | FINMA、WEKO、EDÖB、VPB | Sitecore/カスタム API |
| 州裁判所のポータル | 26 の州裁判所プラットフォーム(Weblaw、Tribuna、FindInfo、カスタムポータル) | 裁判所ごとのスクレイパー |
複数のソースに掲載されている判決は、decision_id(裁判所コードと正規化された事件番号から生成される決定的なハッシュ)で重複を排除します。全文が最も長いバージョンを保持します。
法的根拠
スイス法では、裁判所の判決は公開記録です。BGG 第 27 条により、連邦最高裁判所には判決を公開する義務があります。Bundesgericht は、裁判所の判決を一般に利用できるようにしなければならないとの判断を一貫して示しています(BGE 133 I 106、BGE 139 I 129)。このプロジェクトがスクレイピングするのは、一般に公開され、公式に公表された判決のみです。
ガバナンスと削除
再公開によって情報の見つけやすさが変わるため、このプロジェクトでは、ソースでの取り下げ、再匿名化、確認済みの訂正・削除依頼を扱うガバナンスポリシーを設けています。docs/governance-and-removal-policy.mdをご覧ください。
貢献者
メンテナー:Jonas Hertner。初期ユーザー、バグ報告者、機関パートナー、利用者側のインテグレーターからなる小規模なグループが、このツールの開発に貢献してきました。全リストとご自身の名前を追加する方法については、CONTRIBUTORS.mdをご覧ください。
スクレイパーへの貢献者、データセットの利用者、法律事務所のインテグレーター、研究プロジェクトなど、OpenCaseLaw を本番環境で使用している方は、ぜひお知らせください。[email protected] にメールするか、ディスカッションを開始してください。
ライセンス
コード:MIT。LICENSEをご覧ください。
データセットのパッケージ化および追加メタデータ:権利が存在する範囲で CC0-1.0。元となる判決文は、各裁判所および公的機関が公開した公式の判決文です。
お問い合わせ
ご質問、ご意見、ご提案がありましたら、[email protected] までご連絡ください。
GitHub でイシューを作成することもできます。
プロジェクトの最新情報はLinkedInでお知らせしています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。




