mcpField
O
OpenCaseLaw — Swiss Caselaw, Statutes & Doctrine

OpenCaseLaw — Swiss Caselaw, Statutes & Doctrine

远程服务
opencaselaw.ch法律与政务75今天更新

关于 OpenCaseLaw — Swiss Caselaw, Statutes & Doctrine

OpenCaseLaw 为法律研究人员和 AI 工具提供瑞士判例、法规及引证数据。其 MCP 服务支持德语、法语和意大利语法律研究,也提供 REST、CLI 和 Parquet 访问方式。

主要功能

  1. 01搜索逾百万条法院记录
  2. 02检索联邦及州级法规
  3. 03探索判例与法规引证
  4. 04获取判决结构及段落
  5. 05访问立法材料与评注

适用场景

  1. 01查找瑞士各法院判决
  2. 02追踪主要判例和上诉链
  3. 03核验法律草稿中的引证
  4. 04整理可分享的研究证据包

MCP 相关

远程 MCP 服务提供 42 个公开研究工具,可用于搜索判决和法规、探索引证关系及获取结构化法律材料。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://mcp.opencaselaw.ch/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

全部服务地址
Streamable HTTPhttps://mcp.opencaselaw.ch/mcp
SSEhttps://mcp.opencaselaw.ch/sse

工具

42
参数类型必填说明
limitinteger否最大结果数(默认值 10,最大值 50)。
querystring是自然语言或关键词查询。

详细介绍

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 的轻量命令行客户端,专为处理聊天窗口 不擅长的两类任务而设计:核对草稿中的引证,以及将备忘录背后的证据 保存在可共享的文件夹中。它已发布至 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

第一个命令会逐条列出引证,说明判决是否存在、具体是哪份判决,以及请求的 Erwägung 是否存在。第二个命令会将选定的判决、段落和法规条文保存到一个文件夹中,其中包含通俗易懂的 INDEX.md 和带哈希的 manifest.json。所有内容均由服务原样返回:引证字符串、段落文本和来源链接。搜索范围有限制;引证核查只确认判例是否存在,并不确认其是否支持某项主张。请参阅 CLI 指南。

对话请使用 MCP,自动化请使用 CLI 或 REST API,语料规模的分析请使用 Parquet。

真实结果示例

问题。 根据瑞士法律,员工提出主张后遭到报复性解雇,在什么情况下构成滥用?

一次调用 — 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 万条法规引用
释义层联邦委员会咨文、评注、开放获取学术研究、联邦行政实践
访问方式Web、MCP、REST、研究命令行、每日 CC0 Parquet
许可CC0 数据、MIT 代码(ECtHR 文本 © ECHR-CEDH,详见数据卡)

计数均由唯一事实来源生成,见 docs/canonical_numbers.md,每项数据旁均记录了验证方法。

明确说明局限性。 门户限制访问的来源无法做到完全覆盖;我们会记录这些来源,而不是避而不谈。引用图谱报告的是解析 覆盖率(93.8 %),并非精确率估计——人工语义审计正在准备中。部分州级裁决可能未经删节即由法院发布;我们沿用上游的假名化处理,不会再次进行假名化。请参阅 治理与移除政策。

一周,绘于图中

每周五,我们会用五种方式描绘瑞士判例法中的这一周,每种方式对应网站的一种语言:浮雕地图(德语)、以线条呈现的 151 年(法语)、乐谱(意大利语)、色块(罗曼什语)和收据(英语)。同一周,同一组数字。完整档案见 opencaselaw.ch/posters。

本周德语海报:按法院所在地呈现新裁决的浮雕地图 本周法语海报:自 1875 年以来每年判例法对应一条线 本周意大利语海报:按州和夜晚呈现新裁决 本周罗曼什语海报:按语言区域呈现新裁决 本周英语海报:按法院列出新裁决

这些海报由 scripts/weekly_poster_editions.py 根据已提交的 docs/stats.json 历史记录生成,与语料库一样采用 CC0 许可。

贡献

数据质量报告是最有价值的贡献——迄今为止收到的每一份报告都已复现、修复,并通过回归测试加以锁定。请参阅 CONTRIBUTING.md。


本页其余部分为参考详情。

项目缘起

如今,瑞士法律研究分散在各个付费墙之后,无法供大模型访问,而且费用高得令人难以承受,最需要它的人——法学院学生、独立研究人员以及大型律所之外的所有人——尤其如此。商业数据库(Weblaw、Swisslex、Legalis)每月收费数百瑞郎,却仍不提供整洁的 API。大模型因无法获取权威来源而会编造法规文本。小州将裁决发布在无人索引的 PDF 档案中。

OpenCaseLaw 解决了这些问题。每一项已发布的瑞士法院裁决、每一部联邦和州级法律、它们之间已解析的引用图谱,以及 44 个 MCP 工具(公共模式下有 42 个远程工具,另有 2 个仅限本地使用),让任何现代大模型都能充当瑞士法律研究助手——全部免费、全部开放、全部自动更新。

你将获得什么

判例 —— 超过 1,050,000 条裁决记录(约 909,000 项唯一裁决;保留并关联跨标识符重复记录,绝不删除),涵盖 1875 年至今、118 家法院,提供全文和结构化元数据,包括:

  • 全部 7 家联邦法院(BGer、BVGer、BStGer、BPatGer、BGE、BGE 历史判例、BGE-EGMR)
  • 联邦军事法院(Militärkassationsgericht / MKG,1915–2025 年的 1,244 项裁决)
  • 全部 26 个州级法院系统(第一、第二和第三审级)
  • 监管机构裁决(FINMA、ComCo、FDPIC、IndepBC、ElCom、PostCom、ComCom)
  • ECHR/EGMR:涉及瑞士作为被申请国的资料(487 篇由 BGE 发布的 EGMR 译文、847 篇标记为涉及瑞士的 HUDOC 文档),以及针对 46 个被申请国中任一国家、重要性为 1–3 的所有 ECtHR 分庭和大法庭判决——共 8,275 项判决;法院发布法文文本时使用法文,否则使用英文。重要性为 4 的判决(重要性低且重复,涵盖委员会的全部案件)和可受理性裁决不在范围内。
  • 三种官方语言:德语 463,012(46.7%)、法语 446,869(45.1%)、意大利语 81,796(8.2%);架构为罗曼什语保留了 rm
  • 通过案号规范化和结合内容长度的合并进行去重
  • 每日更新;BGer 判决在法院发布后约 15 分钟内即可获取

立法 —— 每一项瑞士联邦和州级法律均在本地镜像,并按条文建立索引:

  • 5,525 项联邦法律 / 每种德语、法语和意大利语版本约 133,359 条条文,来自 Fedlex SPARQL 端点
  • 15,600 项州级法律 / 361,430 条条文,直接从全部 26 个州抓取(LexWork 涵盖 18 个州,SIL 涵盖 2 个州,ZH OpenData 涵盖 ZH,TI~RL 涵盖 TI);对于主要门户中缺失的法律,LexFind PDF 备用来源补充了 4 个州
  • 统一的 SQLite FTS5 搜索可同时检索两个语料库;条文查找耗时不到 1 毫秒
  • 每月 2 日刷新(法律生效后的次日)
  • 1,240 万条裁决到具体法规条文的已解析链接

引文图谱 —— 瑞士法律体系中唯一公开的大规模引文图谱:

  • 965 万条已解析的裁决间引文边(共提取 1,000 万条),附带置信度分数
  • 1,240 万条裁决到法规的链接,已根据当前合并文本解析
  • 双向查找、上诉链解析(Instanzenzug)、按引文权威性对指导性案例进行排名
  • 支持 find_leading_cases、find_citations、find_appeal_chain、analyze_legal_trend(排名第一:BGE 125 V 351,共有 85,108 条入引文) 44 个 MCP 工具(公开模式下有 42 个远程工具 + 2 个仅限本地的工具)——可在你选择的大模型中运行的专业研究工具:
  • 自然语言决策搜索(BM25 + 同义词扩展 + Haiku 重排,在 100 条查询的黄金集上达到 MRR@10 = 0.647)
  • 重要判例发现、引证网络、上诉链、判例法演变
  • 联邦和州法律条文查询,以及两者的全文搜索——支持口语→法律词汇扩展(搜索 “Vaterschaftsurlaub” 可找到相关法规,尽管法规写的是 “Urlaub des andern Elternteils”),并支持跨语言州法律搜索(德语查询可找到法语/意大利语州法律)
  • 法理概览(法规 + 按权威性排序的 BGE + 时间线 + Botschaft 参考)
  • 立法沿革(Materialien)——包含 83,958 条 Botschaft 修法引用,涵盖 9,139 份 BBl 出版物和 33,465 个不同的(法规,条文)组合;《联邦公报》(Bundesblatt)Materialien 原文(19,800 多份 DE/FR/IT 文档、约 165 万段:联邦委员会 Botschaften、联邦委员会的报告和意见、议会委员会报告、法案草案;自 1999 年起与 Fedlex 数据完整对应,1850–1999 年的内容正在根据联邦档案扫描件补充;有 26,500 多个链接指向相关法规条文),以及Fedlex 上自 1993 年以来的每次联邦 Vernehmlassung(2,694 项程序,涵盖 FOJ 立法项目;10,296 份文档原文:Erläuternde Berichte、Vorlagen、Ergebnisberichte、Stellungnahmen——其中 Stellungnahmen 自 2016 年起系统地发布于 Fedlex),可通过 search_botschaft(对原文语料进行主题全文搜索,支持按 doc_type 筛选)、get_materialien(Fedlex 链接到某项法律的文档和征询意见,以及针对某条文的 Erläuternder-Bericht 段落)、get_article_purpose(特定条文的 Botschaft 原文)和 get_article_history(整合法规 + Botschaft + 重要判例 + 评论的时间线)访问;BV 和 BGFA 的逐条摘要(立法意图、关键论据、设计选择、被否决的替代方案);BV 的议会辩论记录。通过 Fedlex SPARQL 发现机制,将 Botschaften 原文完整摄取并扩展至约 25,000 份的工作正在进行。
  • 判决结构访问——get_decision_structure(拆分 Sachverhalt + Erwägungen + Dispositiv + Regeste)、get_erwaegung(原文 Schweizer 引证格式的单元,例如 get_erwaegung("BGE 136 III 513", "2.3"))、get_regeste(BGer/BVGer/BStGer 官方判决要旨)
  • 在线评论查询,来源包括 OnlineKommentar.ch 和 OpenLegalCommentary.ch(1,131 篇评论)
  • 根据真实 BGE 案情生成的Fallbearbeitung 考试题,并附带用于练习的隐藏分析
  • 根据案情起草模拟判决(用于为大模型输出提供依据的研究工具)
  • 结构化案件摘要(regeste、Sachverhalt、Erwägungen、Dispositiv、引述的法规、权威文献)

多种访问方式——与你的 AI 聊天、自动化研究,或下载语料库:

面向大模型用户、研究人员和开发者:

  • 远程 MCP 服务,地址为 mcp.opencaselaw.ch(SSE + Streamable HTTP)——可在任何 MCP 客户端(Claude、ChatGPT、Cursor、Gemini、Windsurf)中用 30 秒完成设置
  • 适用于 Grok/xAI 和任何支持函数调用的大模型 API 的 OpenAI 兼容工具定义
  • 本地 MCP 服务——具备完整离线能力,包含全部 44 个工具(2 个仅限本地的更新工具可离线使用),需要约 65 GB 磁盘空间
  • 轻量级研究命令行工具——支持 JSON/JSONL、批量输入、保存证据包和引证解析;pipx install opencaselaw-cli;源码位于 clients/python/
  • REST API,附带交互式文档(Swagger UI + OpenAPI 规范)
  • 通过 HuggingFace 数据集批量下载 Parquet(约 7 GB)
  • 可在 opencaselaw.ch 使用实时仪表板和浏览界面 面向起草文件的法律从业者——精选的从业者工具集:
  • Word 插件 — 搜索判决,并直接在 Word 中插入格式正确的瑞士法律引注(无需复制粘贴)。点击一项 Erwägung,即可插入带有正确子引注的内容;点击法律条文 §,即可插入相应款项。免费的 Audit 会扫描整份文件,检查虚构的引注和错误的定位信息(确定性检查,不使用大模型)。Pro tier(通过 Stripe 计费,每月 CHF 5,每天共享 25 次 AI 调用,始终启用基于模式的客户端 PII 脱敏;范围和限制见 word.opencaselaw.ch/privacy.html)还提供四种 AI 工具:Verify(将单条引注与判决全文进行核对)、Strengthen(为段落进行 X 光分析,提供按引注图中心性排序的主导判例建议和评注摘录)、Find Support(查找支持无依据陈述的判决,并以 0–100 评分)和 Reflect(为整份文件提供文学映照——一部呈现相同人性困境的典范作品,加一个反思性问题)。通过 REST API 提供约 8 种 MCP 工具(公开模式下有 42 种远程工具,另有 2 种仅限本地的工具),专为撰写法律意见书的工作流优化。

可在论文中论证的性能:

指标数值
判决搜索质量MRR@10 = 0.647(在线)/ 0.470(可复现的离线结果)· 比基线高 102 %
条文查询延迟< 1 ms(本地 FTS5)
BGer 发布到可搜索~15 min(轮询器上线前为 24 h)
每日全文重建~5 h,零停机(原子交换)
引注到判决的解析已解析 9.65 M 条边(共提取 10 M 条)

项目介绍

这是一个结构化、可搜索的瑞士法院判决档案库,收录从联邦最高法院(BGer)到全部 26 个州法院的判决。每份判决都包含完整判决文本、案号、日期、语言、法律领域、法官、引用的判决,以及 20 多个其他元数据字段。

数据集通过直接抓取官方法院网站和州法院门户网站构建。每天夜间都会抓取、去重并发布新判决。

根据你的需求,有八种使用方式:

方式适用对象可获得的内容
使用 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,每天 25 次 AI 调用):Verify(对照全文核验引注)· Strengthen(段落透视分析 + 重要判例建议)· Find Support(查找支持某项陈述的判决)· Reflect(文学镜像)——精选约 8 个工具的子集
REST API / 下载开发者、数据科学家、NLP 研究人员研究 REST API,通过 HuggingFace 批量下载 Parquet 数据(约 7 GB)
Web 界面所有人实时仪表板,包含语料库统计、每日增量、变化最大的项目,以及多语言浏览功能

不确定从哪里开始? 连接到远程 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 地址与查询一同存储,也没有账户或登录流程,而且会话标识符每次连接都会更换。完整详情请见五种语言版本的:隐私声明。如果你的查询包含机密信息,或你代表客户提交查询,请使用下方的选项 B,在本地运行语料库,确保任何信息都不会离开你的设备。

Claude.ai / Claude Desktop(最简单):

  1. 打开 设置 → 连接器
  2. 点击 “添加自定义连接器”
  3. 粘贴 https://mcp.opencaselaw.ch
  4. 点击 添加

浏览器(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:

  1. 打开 设置 → 应用 → 高级设置 → 启用 开发者模式
  2. 点击 创建应用 → 将其命名为 Swiss Caselaw,粘贴 https://mcp.opencaselaw.ch/sse,身份验证:无
  3. 在任意聊天中:点击 + → 开发者模式 → 选择 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 开发套件):

构建可使用所有工具的 Gemini 驱动 Agent:

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 是 Anthropic 提供的命令行工具,用于在终端中使用 Claude。

步骤 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 并进行首次搜索。

首次使用时,服务会自动:

  1. 从 HuggingFace 下载所有 Parquet 文件(约 7 GB)到 ~/.swiss-caselaw/parquet/
  2. 在 ~/.swiss-caselaw/decisions.db 构建本地 SQLite FTS5 全文搜索索引(约 58 GB)

根据设备和网络连接情况,这需要 30–60 分钟。此过程仅需执行一次,之后即可通过本地数据库即时搜索。

磁盘总用量: ~/.swiss-caselaw/ 中约 65 GB(macOS/Linux),或 %USERPROFILE%\.swiss-caselaw\(Windows)。

使用 Claude Desktop 进行设置

请参阅 Claude Desktop 设置指南,了解分步说明(macOS + Windows)。

快速设置 — 将以下内容添加到 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 数据集还可能在 artifacts/sqlite/snapshots/ 下发布完整的压缩 SQLite 基础快照,供引导工具使用。其元数据位于 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 是一个包含两张表的 SQLite 单文件:

  • decisions — 主表,每项裁决占一行。包含 24 个列,包括面向搜索的字段,以及 json_data(完整记录数据块)和用于支持去重查询的 canonical_key。表按 court、canton、decision_date、language、docket_number、chamber 和 decision_type 建立索引,以便快速筛选查询。

  • decisions_fts — 一个 FTS5 虚拟表,镜像 decisions 中的 7 个文本列:court、canton、docket_number、language、title、regeste 和 full_text。FTS5 会在这些列上构建倒排索引,从而支持对 100 万多项裁决进行亚秒级全文搜索。分词器为 unicode61 remove_diacritics 2,可处理德语、法语、意大利语和罗曼什语中的重音字符。插入、更新和删除触发器会自动使 FTS 索引与主表保持同步。

为何约为 58 GB。 96.2 万多项法院裁决的全文平均每项约 15 KB。对于每个唯一词元、其所在位置以及所属列,FTS5 倒排索引都会增加额外开销。这是已知的权衡:大型文本语料的 FTS5 索引会远大于源数据,但它无需外部基础设施即可实现即时排序搜索。

搜索流程。 搜索时,服务会:

  1. 检测查询意图 — 查询案号(6B_1234/2023)、显式 FTS 语法(Mietrecht AND Kündigung)或自然语言(decisions on tenant eviction)。

  2. 运行多种 FTS5 查询策略 — 对于自然语言查询,服务会生成多个 FTS 查询变体(AND、OR、短语、聚焦于 regeste/title 字段,以及扩展多语言词项),并依次执行。每种策略都会产生一组排序后的候选结果。对于显式语法(AND/OR/NOT、带引号的短语、列筛选器),会优先尝试原始查询。

  3. 通过 RRF 融合候选结果 — 使用倒数排名融合(Reciprocal Rank Fusion)合并所有策略的结果:每个候选结果的分数是所有返回该结果的策略中 1/(k + rank) 的加权总和。被多种策略找到的裁决会获得加权提升。

  4. 使用信号评分重新排序 — 根据综合分数对排名靠前的候选结果重新排序,该分数结合了:

    • BM25 分数(来自 FTS5,采用自定义列权重:full_text 1.2、regeste 5.0、title 6.0——判决摘要和标题的权重大幅高于正文)
    • 词项在标题(3.0 倍)、regeste(2.2 倍)和摘要片段(0.8 倍)中的覆盖率
    • 标题/regeste 中的短语匹配(1.8 倍)
    • 案号匹配 — 完全匹配(6.0 倍)或部分匹配(2.0 倍)
    • 法规/引用图信号 — 如果查询提及某条款(例如,“Art. 8 BV”),引用该条款的裁决会获得加权提升
    • 法院先验权重 — 例如,庇护相关查询会提升 BVGer 的结果
  5. 选择最佳段落 — 对每条结果,服务都会扫描全文,找出最相关的段落,并将其作为摘要片段返回。

可用工具

以下工具在远程和本地均可用,另有说明的除外。

工具描述
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法律主题 → 真实 BGE 案情,附带隐藏分析,用于 Fallbearbeitung 练习
get_law按 SR 编号 / 缩写及可选州查询瑞士联邦或州法律。从本地镜像返回完整条文文本(联邦法律来自 Fedlex;州法律来自 cantonal_laws.db——22 个州直接抓取门户网站,其余 4 个州通过 LexFind 提取 PDF)
search_laws统一搜索联邦和州法律的 FTS5 搜索,并通过 BM25 排名交错排列。使用 canton= 筛选特定司法辖区,或使用 jurisdiction='federal' / 'cantonal'
get_commentary从 OnlineKommentar.ch 获取特定联邦法律条文的学术评注(CC-BY-4.0)
search_commentaries在 OnlineKommentar.ch 上的 362 篇法律评注中进行全文搜索,涵盖 19 项联邦法律
search_legislation基于 LexFind 的联邦和州立法发现搜索。fetch_top_n_texts=N 可在一次调用中为排名前 N 的结果补充完整条文文本
get_legislation获取任何联邦或州法律的完整元数据和条文文本。优先使用本地数据(statutes.db → cantonal_laws.db → LexFind API 回退)
browse_legislation_changes按州或联邦层级查看近期变更动态(实时 LexFind API,无本地镜像)
update_database从 HuggingFace 重新下载最新 Parquet 文件并重建本地数据库 (仅本地)
check_update_status检查正在运行的数据库更新进度 (仅本地)
引文完整性工具包(防幻觉)

OpenCaseLaw 将瑞士法律引文视为一个封闭语料库问题:大模型写出的每个引用,要么能在约 105 万条记录组成的语料库及 Fedlex 法规镜像中找到对应条目,要么不能。MCP 服务提供一套包含四种工具的工具包,可端到端地强制执行这一约定。

工具用途
cite为瑞士引文生成规范的 citation_string 和 canonical_url。如果引文是编造的,则返回 exists=false 和 close_matches;大模型应照抄返回的字符串,而不是自行构造。
check_claim_support针对每项主张的 Sonnet 裁判:给定(主张、decision_id、可选的 pinpoint),根据逐字引用的 Erwägung 文本返回 supports: yes / partial / no / contradicts / unrelated。使用与执行检索的模型(Haiku)不同的模型系列(Sonnet),避免在验证中再次引入检索错误。
attest_response最终审计,在发送最终答案前调用一次。对大模型的草稿最多运行 五 项检查:
① 案例 — 每条 BGE/BGer/BVGer/BStGer/BPatGer/MKGE 引用均真实存在,且每个 pinpoint 都可解析;
② 法规 — 每条 Art. X LAW 引用都能在 statutes.db 中解析;
③ 引文 — 每段不少于 30 个字符的 "…" 都逐字出现在引用来源(判决或法规)中;
④ 日期 — 每个紧邻引用的 vom DD.MM.YYYY 都与存储的判决日期一致;
⑤ 依据核验(通过 audit_grounding=true 启用)— 对每条已验证的引文,独立的 Sonnet 裁判会检查引用来源是否确实支持大模型附加其上的论述。
返回可直接发送的 linked_text,其中每条通过验证的引文都已包裹在 Markdown 链接中。
get_erwaegung / get_regeste / get_law / get_materialien / get_commentary提供逐字文本的来源,是大模型唯一获准直接引用的来源。

该架构旨在防范两类经实证测量的法律大模型错误:

  • 幻觉(Dahl、Magesh、Suzgun 和 Ho,Large Legal Fictions,Stanford RegLab,2024 — Journal of Legal Analysis):向通用大模型提出的法律问题中,有 58–88 % 至少会产生一条编造的权威依据。Stanford RegLab 后续对商用法律 RAG 工具的研究(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 工具 — 你可以直接查看搜索结果,并针对特定判决提出后续问题。

引用图工具

四种工具可访问引用图: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 — 追踪某项判决的上诉链(审级链)。显示先前审级(下级法院)和后续审级(向上级法院提起的上诉),重建完整的诉讼程序路径(例如,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 中的至少一项。

法规查询工具(本地,联邦和州级)

两个工具可直接从本地镜像获取瑞士法律文本,覆盖联邦和州级管辖范围,并提供文章级 FTS5 索引和亚毫秒级查询:

  • **联邦:**通过 Fedlex SPARQL 端点获取 5,525 部法律 / 约 133,359 条文章,分别使用德语、法语和意大利语版本;每月镜像至 statutes.db。涵盖德语、法语和意大利语中的所有整合版联邦法案。
  • 州级:cantonal_laws.db 中有 15,600 部法律 / 361,430 条文章,数据来自以下两种途径:
    • 直接抓取门户(主要方式)——22 个州的官方 Gesetzessammlungen 通过 LexWork、SIL、ZH OpenData 或 TI Raccolta delle Leggi 平台发布(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 提供双语第二语言处理。
    • 与联邦表通过 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(可选——限定一个州,或设为 CH 以仅搜索联邦法律)、jurisdiction(all / federal / cantonal,默认 all)、language(de/fr/it)、limit(1–50)。

法规发现工具(基于 LexFind)

另外三个工具在本地镜像之上接入实时 LexFind API,用于处理镜像无法满足需求的情况——例如刷新周期之间新发布的版本、完整版本历史和近期变更动态。这些工具提供更广泛的发现功能;对于简单的“获取现行文本”查询,get_law / search_laws 更快、更可靠。

search_legislation——在瑞士法规中进行更广泛的发现搜索,并可选择在单次调用中补充全文内容。如果不确定法规属于联邦还是州级,或需要一次性完成自然语言工作流,此工具会很有用。

> 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)。

教育工具

三个工具支持法律学习,涵盖学生的三项核心工作流:理解案件、理解法理,以及练习考试涵摄。工具会返回丰富的结构化数据;Claude 作为导师,动态生成所有教学内容。

get_case_brief — 任意案件引用(“BGE 133 III 121”、案号或 decision_id)→ 结构化简报。返回 regeste、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。在包含 100 条查询的完整查询集上,针对本地 decisions.db 中的 1,078,177 行数据运行,记录的指标为 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. 下载数据集

完整数据集以 Parquet 文件的形式托管在 HuggingFace 上——每个法院一个文件,每项判决包含 34 个字段,其中包括完整的判决文本。

供机器读取的构件元数据发布在 artifacts/manifest.json 中。除了每日 Parquet/SQLite 增量之外,清单还可能指向一个可选的完整压缩 SQLite 快照,路径为 artifacts/sqlite/snapshots/<date>.decisions.sqlite.zst,供希望直接从 Parquet 之外的数据引导本地 FTS5 数据库的工具使用。

使用 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)
直接下载

每个法院对应一个 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 --versionnodejs.org — 下载 LTS 版本
LLM 服务提供商(见下文)至少一个云端 API 密钥或通过 Ollama 使用本地模型
约 65 GB 可用磁盘空间df -h .(macOS/Linux)用于搜索索引(首次运行时下载)

Windows 用户: 从 python.org 安装 Python,并在安装过程中勾选“Add Python to PATH”。Node.js 会自动安装 npm。

云端服务提供商(至少选择一个,或使用下文的 Ollama)
服务提供商环境变量密钥获取方式费用
Google GeminiGEMINI_API_KEYaistudio.google.com/apikey提供免费套餐
OpenAIOPENAI_API_KEYplatform.openai.com/api-keys新账户可获得免费额度
Anthropic(Claude)ANTHROPIC_API_KEYconsole.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

激活虚拟环境:

操作系统命令
macOS / Linuxsource .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

然后至少安装一个大模型提供商的 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... 改为你的实际密钥。其他提供商对应的行保持不变——如果留空,系统会忽略它们。

你也可以跳过此步骤,在启动后通过界面中的 Settings 面板配置密钥。

步骤 6. 启动应用:

操作系统命令
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 密钥
  • 流式响应:实时逐个 token 显示响应
  • 工具增强型聊天:AI 会自动调用搜索、get_decision、list_courts 等工具
  • 决策卡片:可点击的法规引用,附带 Fedlex 条文内嵌文本
  • 筛选器:按法院、州、语言和日期范围缩小结果范围
  • 应用内设置:通过界面配置 API 密钥和 Ollama 连接
  • 导出:将对话下载为 Markdown、Word 或 PDF
故障排除
问题解决方案
python3: command not found(Windows)改用 python 而不是 python3,或重新安装 Python,并勾选 “Add to PATH”
npm: command not found从 nodejs.org 安装 Node.js
ModuleNotFoundError: No module named 'fastapi'激活虚拟环境(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_idstringbger_6B_1234_2025唯一键:{court}_{docket_normalized}
courtstringbger法院代码(完整列表)
cantonstringCH联邦法院使用 CH,州级法院使用 ZH/BE/GE/...
docket_numberstring6B_1234/2025公布时的原始案件编号
decision_datedate2025-03-15作出裁决的日期
languagestringdede、fr、it 或 rm
full_textstring(完整文本)裁决全文,通常为 5–50 页
source_urlstringhttps://bger.ch/...原文的永久链接
法律内容
字段类型说明
regestestring法律要旨/摘要(Regeste)
legal_areastring法律领域(Strafrecht、Zivilrecht 等)
titlestring主题行(Gegenstand)
outcomestring结果:Gutheissung、Abweisung、Nichteintreten 等
decision_typestring类型:Urteil、Beschluss、Verfügung 等
cited_decisionsstring所引裁决参考文献的 JSON 数组
bge_referencestring如已发布,则为 BGE 汇编参考文献
abstract_destring德语摘要(主要为 BGE)
abstract_frstring法语摘要
abstract_itstring意大利语摘要
法院元数据
字段类型说明
chamberstring审判庭(例如,“I. zivilrechtliche Abteilung”)
judgesstring合议庭成员
clerksstring法院书记员(Gerichtsschreiber)
collectionstring官方汇编参考文献
appeal_infostring上诉状态/后续诉讼程序
技术字段
字段类型说明
docket_number_2string次级案件编号
publication_datedate在线发布日期
pdf_urlstringPDF 直链
external_idstring交叉引用 ID
scraped_atdatetime抓取此裁决的时间
sourcestring数据源标识符
source_idstring特定数据源的 ID(例如 Signatur)
source_spiderstring数据源爬虫/抓取器名称
content_hashstring用于去重的 full_text 的 MD5 值
has_full_textboolfull_text 是否非空
text_lengthintfull_text 的字符数

完整的 34 个字段的 Parquet 导出架构:export_parquet.py


覆盖范围

联邦法院
法院代码判决数时段来源
联邦最高法院(BGer)bger约 173,0001996 年至今bger.ch
BGE 指导性判例bge约 45,0001954 年至今bger.ch CLIR
联邦行政法院(BVGer)bvger约 91,0002007 年至今bvger.ch
联邦行政实践(VPB)ch_vb约 2,5001987–2017 年amtsdruckschriften.bar.admin.ch(联邦档案馆;已冻结,该系列于 2018 年结束)
联邦刑事法院(BStGer)bstger约 11,0002004 年至今bstger.weblaw.ch
EDÖB(数据保护)edoeb约 1,2001994 年至今edoeb.admin.ch
FINMAfinma约 1,2002008–2024 年finma.ch
ECHR(由 BGer 发布的瑞士案件)bge_egmr约 4751974 年至今bger.ch CLIR
ECHR 瑞士(HUDOC)hudoc_ch8341959 年至今HUDOC API
ECtHR 分庭判决ecthr_chamber7,7611960 年至今(法语或英语)HUDOC API
ECtHR 大法庭ecthr_grand_chamber5141960 年至今(法语或英语)HUDOC API
ECtHR 委员会判决ecthr_committee0 — 重要性 4,超出范围HUDOC API
军事上诉法院(MKG)mkg1,2441915–2025 年oa.admin.ch + alexandria.ch
联邦专利法院(BPatGer)bpatger约 1902012 年至今bpatger.ch
竞争委员会(WEKO)weko约 1202009 年至今weko.admin.ch
体育仲裁法庭ta_sst约 502024 年至今ta-sst.ch
联邦委员会ch_bundesrat约 152012 年至今bj.admin.ch
州法院

覆盖全部 26 个州的 77 家法院。规模最大的州级判例集:

州法院数判决数时段
沃州(VD)3约 155,0001984 年至今
苏黎世州(ZH)20约 126,0001980 年至今
日内瓦州(GE)1约 116,0001993 年至今
提契诺州(TI)1约 58,0001995 年至今
圣加仑州(SG)7约 35,0002001 年至今
格劳宾登州(GR)1约 29,0002002 年至今
巴塞尔乡村州(BL)1约 26,0002000 年至今
伯尔尼州(BE)6约 26,0002002 年至今
阿尔高州(AG)18约 21,0001993 年至今
巴塞尔城市州(BS)3约 19,0002001 年至今

覆盖全部 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         │
                        └──────────────────────────────────────────────────────┘
分步说明
  1. 抓取(每日 01:00 UTC)— 45 个抓取器并行运行,每个抓取器针对特定法院的网站或 API。每个抓取器均设有速率限制,并支持断点续传:它会跟踪已发现的判决,仅获取新增判决。输出:每家法院对应一个 JSONL 文件。另有一个 Fedlex 抓取器通过 SPARQL 下载联邦法律文本(Akoma Ntoso XML),用于法规数据库。

  2. 构建搜索索引(04:00 UTC)— 将 JSONL 文件导入 SQLite FTS5 数据库,以支持全文搜索。周一至周六采用增量模式:通过字节偏移检查点跟踪每个 JSONL 文件的读取进度,因此只处理新追加的判决(通常少于 1 分钟)。周日执行完整重建,压缩 FTS5 索引并重置检查点(约 3 小时)。通过 decision_id 对出现在多个来源中的判决去重,并保留全文最长的版本。质量增强步骤还会补充缺失的标题、裁判摘要和内容哈希。

  3. 导出— 将 JSONL 文件转换为 Parquet(每家法院一个文件),使用固定的 34 个字段的架构。

  4. 上传— 将 Parquet 文件推送到 HuggingFace。MCP 服务和 datasets 库会自动获取新数据。可选的制品发布也能更新 artifacts/manifest.json,其中包含每日增量数据以及完整压缩的 SQLite 快照,供外部引导工具使用。

  5. 更新仪表板— 重新生成 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——每行一个 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 格式(每个法院对应一个文件)。输出写入 output/dataset/。


数据来源

来源内容方式
官方法院网站联邦法院(bger.ch、bvger.ch、bstger.ch、bpatger.ch)JSON API、结构化 HTML
联邦监管机构FINMA、WEKO、EDÖB、VPBSitecore/自定义 API
州级法院门户网站26 个州级平台(Weblaw、Tribuna、FindInfo、自定义门户)法院专用抓取器

多个来源中出现的裁决会按 decision_id 去重(该 ID 是法院代码与规范化案号的确定性哈希值)。保留全文最长的版本。


法律依据

根据瑞士法律,法院裁决属于公共记录。《联邦最高法院法》第 27 条要求联邦最高法院公布其裁决。联邦法院一贯认为,法院裁决必须向公众开放(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。

评论

支持 Markdown

第一次接触 MCP?

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

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