# Swiss Case Law MCP server

956k Swiss court decisions: full-text search, citation graph, statute lookup (DE/FR/IT)

## Links
- Registry page: https://www.getdrio.com/mcp/ch-opencaselaw-swiss-caselaw
- Repository: https://github.com/jonashertner/caselaw-repo-1
- Website: https://opencaselaw.ch

## Install
- Endpoint: https://mcp.opencaselaw.ch
- Auth: Not captured

## Setup notes
- Remote endpoint: https://mcp.opencaselaw.ch

## Tools
- search_decisions - Search Swiss court decisions AND European Court of Human Rights decisions concerning Switzerland (~2,800 ECHR docs across bge_egmr, hudoc_ch, ecthr_chamber, ecthr_committee, ecthr_grand_chamber) using full-text search. Supports keywords, phrases (in quotes), Boolean operators (AND, OR, NOT), and prefix matching (word*). Filter by court, canton, language, date range, chamber, and decision type. Also handles docket number lookup (e.g., 6B_1234/2025) and column-scoped search (regeste:keyword, full_text:keyword). Returns relevance-ranked results enriched with:
- court_name (human-readable), court_level, legal_area
- statutes: relevant statute articles (e.g. Art. 41 OR)
- citation_count: how many decisions cite this one
- cited_by_results: how many other results cite this one
- is_leading_case: true for highly-cited authoritative decisions
Use offset for pagination through large result sets.

To find the MOST RECENT decisions: omit the query (or set it empty) and use sort='date_desc' with optional court/canton filters. Example: query='', court='bger', sort='date_desc', limit=5. Endpoint: https://mcp.opencaselaw.ch
- get_decision - Fetch a single court decision with full text. Look up by decision_id (e.g., bger_6B_1234_2025), docket number (e.g., 6B_1234/2025), or partial match. Full text is truncated at 200,000 characters for very long decisions. Set full_text=false to get only metadata and regeste. Endpoint: https://mcp.opencaselaw.ch
- list_courts - List all available courts with decision counts, date ranges, and language coverage. Use this to discover what data is available. Endpoint: https://mcp.opencaselaw.ch
- get_statistics - Get aggregate statistics about the dataset. Optionally filter by court, canton, or year. Endpoint: https://mcp.opencaselaw.ch
- find_citations - Given a decision_id, show what it cites and what cites it. Uses the reference graph database with 9.86M citation edges. Returns resolved citations with confidence scores and unresolved references. Endpoint: https://mcp.opencaselaw.ch
- find_appeal_chain - Trace the appeal chain (Instanzenzug) for a decision. Shows prior instances (lower courts) and subsequent instances (appeals to higher courts). Reconstructs the full procedural path, e.g. Bezirksgericht → Obergericht → Bundesgericht. Uses the is_prior_instance flag from decision headers. Endpoint: https://mcp.opencaselaw.ch
- find_leading_cases - Find the most-cited decisions for a topic or statute. Authority ranking based on citation graph. Filter by statute (law_code + article), topic query, court, and date range. Top-3 results auto-attach a `pinpoint` field {e_number, matched_sentence, confidence, url, score, source} anchoring the most-relevant Erwägung — see system instructions U3 for how to surface it. Each result also carries citation_string_{de,fr,it} + canonical_url + is_leading_case + citation_count for ready-to-quote Swiss-format citations. Endpoint: https://mcp.opencaselaw.ch
- analyze_legal_trend - Year-by-year decision counts showing jurisprudence evolution. Use with a statute reference (law_code + article), a text query, or both. Returns yearly counts with visual bar chart. Endpoint: https://mcp.opencaselaw.ch
- draft_mock_decision - Build a research-only mock decision outline from user facts. Combines relevant Swiss case law retrieval with statute references. If possible, enriches statutes with Fedlex text excerpts. IMPORTANT: The tool may return clarification questions (high/medium priority). High-priority clarifications must be answered (via the clarifications parameter) before the tool will provide a conclusion. Call again with clarifications to get the full analysis. Endpoint: https://mcp.opencaselaw.ch
- get_case_brief - Structured case brief: regeste, Sachverhalt, key Erwägungen (first 12 only — for orientation, NOT a pinpoint ranking), Dispositiv, statutes, citation authority, related cases. Accepts BGE ref, decision_id, or docket. To pinpoint which Erwägung supports a specific claim, use find_relevant_erwaegung — never guess from key_erwaegungen alone. Endpoint: https://mcp.opencaselaw.ch
- get_decision_structure - Structured decision fields: Sachverhalt (facts), Erwägungen as numbered paragraphs ('1', '1.1', '2.3'), Dispositiv (ruling), Regeste (BGE only). Federal decisions only; for cantonal use get_decision. Returns excerpts; for verbatim full text of one Erwägung, use get_erwaegung. PINPOINT POLICY: never guess. If user gave an e_number → verify with get_erwaegung. If user gave only a claim → use find_relevant_erwaegung (FTS5+BM25 with confidence labels). If neither is confident, report no_match — do NOT default to E. 3.1. Endpoint: https://mcp.opencaselaw.ch
- get_erwaegung - Verbatim text of ONE numbered Erwägung — the citable unit in Swiss practice (e.g. 'BGE 140 III 86 E. 2.3'). Use when the user already gave an e_number. If only a claim was given (no e_number): use find_relevant_erwaegung — never guess. Returns text + sibling Erwägung numbers. e_number: '1', '2.3', '5.2.1', … Endpoint: https://mcp.opencaselaw.ch
- find_relevant_erwaegung - Find which Erwägung paragraph(s) match a legal claim. Server-side FTS5+BM25 over per-paragraph text; returns top-k with confidence labels (high/medium/low) and a highlighted_snippet wrapping the matched sentence in <mark>…</mark> (quote it verbatim). When no_match=true or confidence=low, do NOT cite any Erwägung — report no_match. Federal decisions only. Replaces the 'always-E.-3.1' guessing pattern. Endpoint: https://mcp.opencaselaw.ch
- get_article_purpose - Return verbatim text from the Federal Council Botschaft (or Erläuterungsbericht) explaining the legislative purpose of a specific article. Joins the verbatim Botschaft corpus (post-2003 BBl publications, Akoma Ntoso XML where available, PDF fallback otherwise) with the article-Botschaft link table. Returns one entry per source — original Botschaft + any amendment Botschaften. All paragraphs are verbatim text the LLM can quote with `bbl_citation, S. {page}` references. USE THIS when the user asks 'what was the purpose of Art. X' or 'what did Parliament intend' or 'why does Art. X exist'. Coverage is rolling — empty `sources` means the verbatim corpus hasn't ingested that article's Botschaft yet; fall back to get_doctrine for the digest layer. Endpoint: https://mcp.opencaselaw.ch
- search_botschaft - Full-text search across the verbatim Federal Council Botschaft corpus. Where get_article_purpose answers 'why does Art. X exist?', this tool answers 'show me every Botschaft passage about TOPIC X'. Useful when the caller doesn't know which SR/article to ask for — e.g. starting from a concept like 'Vaterschaftsurlaub' or 'Klimaschutz'. Returns ranked passages (FTS5 BM25) with bbl_citation, page, section path, and an article anchor where the parser could identify one. Quote verbatim; every snippet has a stable Fedlex ELI URI. Endpoint: https://mcp.opencaselaw.ch
- get_article_history - Chronological story of a single statute article: current text + every linked Botschaft (enacted + amendments) + leading court interpretations + doctrinal commentary, all ordered by date. Combines statutes.db, materialien.db, reference_graph.db, and ok_commentaries.db into one timeline. USE THIS when the user asks 'how did Art. X evolve' or 'what's the full picture on Art. X' — a single call returns the legislative + judicial + doctrinal arc. Endpoint: https://mcp.opencaselaw.ch
- get_regeste - Get the official Regeste (head-note) of a Swiss court decision. The Regeste is the court's own formulation of the legal rule established — for BGEs especially, this is the canonical citation target. Often references specific Erwägungen via '(E. 5.2.1)' which can then be retrieved verbatim with get_erwaegung. USE THIS when the user asks 'what does this case stand for' or 'what is the rule from this decision'. Available for ~54% of federal decisions (100% of BGE). Endpoint: https://mcp.opencaselaw.ch
- check_claim_support - Verify whether a Swiss court decision actually supports a legal claim. Uses an independent Sonnet judge to compare the claim against verbatim text from the decision (Erwägung if pinpoint given, else Regeste, else first portion of full text). Returns {supports: yes|partial|no|contradicts|unrelated, confidence, supporting_excerpt, qualifying_excerpt, reasoning}. CALL THIS for any claim where citing the wrong authority would mislead the user — especially when paraphrasing a decision or drawing a proposition from a complex Erwägung. If supports=no or contradicts, do NOT use the cited decision for that claim. Endpoint: https://mcp.opencaselaw.ch
- attest_response - MANDATORY FINAL-STEP AUDIT covering up to FIVE hallucination classes: (1) case citations — verifies every BGE/BGer/BVGer/BStGer/BPatGer/MKGE/ATF/TF/TAF/TPF/TFB/ATMC/STMC reference exists in the corpus and any pinpoint (E. X.Y / consid. X.Y) resolves to a real Erwägung; (2) statute citations — verifies every Art. X LAW reference resolves in statutes.db (law abbreviation known, article number present); (3) direct quotations — verifies every "…"-quoted substring (≥30 chars) appears verbatim in a regeste / Erwägung / full text of one of the cited sources (decisions or statutes); (4) decision dates — verifies any 'vom DD.MM.YYYY' adjacent to a citation matches the stored decision date; (5) GROUNDING (opt-in via audit_grounding=true) — for each verified citation, the claim sentence immediately preceding it is sent to an independent Sonnet judge alongside the cited Erwägung / Regeste, which decides whether the source supports, contradicts, or is unrelated to the claim. Closes the 'reasoning error' class from Butler & Butler, 'Legal RAG Bench' (Isaacus, 2026): the citation is real and the source was retrieved, but the proposition is not actually supported. Costs one Sonnet call (~3 s) regardless of citation count.

Returns the draft annotated with ✓ or ⚠️ per case citation plus a structured `issues` list with category labels and suggestions. CALL THIS BEFORE emitting your final answer whenever your response contains ≥1 case citation, statute reference, or direct quotation. SET audit_grounding=true for any answer with ≥2 citations or where a wrong proposition would mislead a Swiss lawyer. If ok=false, fix each flagged issue before sending; if ok=true, send `linked_text` verbatim to the user. Endpoint: https://mcp.opencaselaw.ch
- cite - Get the canonical Swiss citation string for a decision reference. CALL THIS BEFORE writing any case citation in your response. Returns ready-to-embed citation_string (DE/FR/IT variants plus a canonical URL) and a verbatim rule_statement. If the reference doesn't exist, returns exists=false plus close_matches for typo-correction — DO NOT guess or construct citations yourself; if you get exists=false, either re-query with a close match or skip the citation entirely. Accepts any Swiss reference form: decision_id (bger_4A_747_2012), BGE reference (BGE 140 III 86), or docket number (4A_747/2012). Optional pinpoint ('2.3') generates the Erwägung-anchored citation and URL. Endpoint: https://mcp.opencaselaw.ch
- get_doctrine - Get statute text + leading cases + doctrinal timeline + Federal Council Botschaft (legislative intent) + scholarly commentary for a Swiss law article or legal concept. ALWAYS USE THIS for questions about the purpose, intent, or ratio legis of a provision — it returns the Botschaft (Materialien) alongside the case law. Input: statute reference ('Art. 41 OR', 'Art. 8 BV') or legal concept. Returns: current statute text, top 5-8 BGEs ranked by citation authority with the rule each establishes, doctrine evolution timeline, Botschaft reference (legislative intent from the Federal Council's message), and scholarly commentary excerpt from OnlineKommentar.ch when available. Endpoint: https://mcp.opencaselaw.ch
- generate_exam_question - Generate a Swiss law exam practice question (Fallbearbeitung) based on a real BGE. Returns a fact pattern (Sachverhalt) from a real court decision and a hidden analysis (applicable statutes, leading case, legal test, correct outcome). Workflow: present the fact_pattern and hint to the student, wait for their analysis, then reveal the analysis field and compare. The student can then call get_case_brief(source_decision_id) to study the full case. Pass exclude_ids from previous calls to avoid repeating the same case. Endpoint: https://mcp.opencaselaw.ch
- get_law - AUTHORITATIVE LOOKUP for the current text of any Swiss law article — federal OR cantonal. Served from two local mirrors:
  • Federal (canton='CH', default): Fedlex mirror — core codes (OR, ZGB, StGB, StPO, ZPO, BV, SchKG, BGG/LTF, DBG, IPRG, AIG, BVG, KVG, AsylG, BGFA and dozens more), all three official languages (DE/FR/IT).
  • Cantonal: LexFind mirror — every cantonal statute and ordinance from all 26 cantons (ZH, BE, LU, UR, SZ, OW, NW, GL, ZG, FR, SO, BS, BL, SH, AR, AI, SG, GR, AG, TG, TI, VD, VS, NE, GE, JU), in each canton's publication language.
Both jurisdictions return the same shape (title, articles with heading + text, article_count, canton, level). Use this BEFORE relying on training-data recall — Swiss statute text changes frequently and LLMs routinely hallucinate article content. Examples: get_law(abbreviation='BV', article='8'); get_law(sr_number='220', article='41'); get_law(canton='ZH', sr_number='554.5', article='1') for Art. 1 of the Zurich Hundegesetz. Endpoint: https://mcp.opencaselaw.ch
- search_laws - UNIFIED full-text search across every Swiss statute article indexed locally — federal (Fedlex mirror) AND cantonal (LexFind mirror across all 26 cantons). BM25-ranked per corpus, merged by interleaving so each response surfaces both jurisdictions. Returns ranked snippets with article number, heading, law title, canton, and level ('federal' | 'cantonal'). Use this as the DEFAULT entry point when the user asks about any Swiss legal topic and you don't know which law or which jurisdiction applies. Filter with canton='ZH' (etc.) for cantonal-only, or jurisdiction='federal'/'cantonal' for explicit scoping. Examples: search_laws(query='Verjährung') — find statute-of-limitations provisions in federal + cantonal laws; search_laws(query='Hundehaltung', canton='ZH') — ZH dog-keeping rules; search_laws(query='Mietrecht', jurisdiction='federal') — federal-only tenancy law. Endpoint: https://mcp.opencaselaw.ch
- get_commentary - Look up a scholarly legal commentary from OnlineKommentar.ch (CC-BY-4.0) for a Swiss federal law article. Without article: lists available commentaries for that law. With article: returns the full commentary text, authors, and citation. Covers 19 Swiss laws including BV, OR, ZGB, StGB, StPO, ZPO, DSG, SchKG, and more. Endpoint: https://mcp.opencaselaw.ch
- search_commentaries - Full-text search across all OnlineKommentar.ch legal commentaries. Searches commentary text, titles, and article numbers. Returns ranked results with snippets, authors, and links. Useful for finding doctrinal discussion of a legal concept across multiple laws. Endpoint: https://mcp.opencaselaw.ch
- get_materialien - Look up Materialien for a Swiss federal law article: Botschaft (legislative intent, key arguments, design choices, rejected alternatives) + parliamentary modifications. COVERAGE TODAY: per-article digests for BV (128 articles) and BGFA (39 articles) only; for every other law the response includes BBl/AS publication-locator refs (`amendment_refs` field) but `sources=[]`. Full per-article digested expansion to all federal laws is in active build — for now, treat empty `sources` as 'no digested Materialien yet' and surface the BBl reference to the user instead of claiming the law has no legislative history. Endpoint: https://mcp.opencaselaw.ch
- search_materialien - Full-text search across digested Materialien (legislative intent, key arguments, design choices, general context). COVERAGE TODAY: BV + BGFA digests + BV parliamentary debate transcripts only. Full per-article digested expansion to every federal law is in active build. Endpoint: https://mcp.opencaselaw.ch
- search_legislation - NATURAL-LANGUAGE SEARCH across all Swiss legislation — 33,000+ federal and cantonal legislative texts from LexFind.ch, covering all 26 cantons (ZH, BE, LU, UR, SZ, OW, NW, GL, ZG, FR, SO, BS, BL, SH, AR, AI, SG, GR, AG, TG, TI, VD, VS, NE, GE, JU) and the federal level, in German/French/Italian. Use this as the ENTRY POINT whenever the user asks about cantonal laws, municipal regulations, or federal ordinances outside the core Fedlex mirror (e.g., 'Hundegesetz im Kanton Bern', 'loi sur les épidémies Vaud', 'Baugesetz Zürich'). SINGLE-CALL MODE: set fetch_top_n_texts=1..3 and the top results are returned with the parsed full text + article list of the law itself — no follow-up get_legislation call needed. Ideal for 'what does cantonal law X say about Y' questions. For core federal codes (OR, ZGB, StGB, BV, StPO, ZPO, SchKG, BGG, DBG, IPRG, AIG, BVG, KVG etc.), prefer get_law / search_laws — they are instant and cover all three languages. Endpoint: https://mcp.opencaselaw.ch
- get_legislation - Retrieve the FULL TEXT and article list of a specific Swiss law, federal or cantonal, by LexFind ID or SR/systematic number. For federal laws in the Fedlex mirror this is instant (local SQLite). For cantonal laws, the law is downloaded from LexFind as PDF, parsed with PyMuPDF, and segmented into articles (cached 30 days). Returns: title, entity, articles (article_num, heading, text), full_text, article_count. Use search_legislation first to find the right lexfind_id or systematic_number; then pass it here. For the core federal codes, get_law is still the fastest path. Endpoint: https://mcp.opencaselaw.ch
- browse_legislation_changes - Browse recent legislation changes for a canton or federal level. Shows new laws, amendments, and abrogations with dates. Endpoint: https://mcp.opencaselaw.ch
- search_practice - Full-text search across Swiss FEDERAL administrative practice (Verwaltungspraxis): Kreisschreiben, Rundschreiben, Weisungen, Vollzugshilfen, Handbücher. These are NOT court decisions — they are the binding interpretive guidance issued by federal agencies (ESTV for tax, SEM for migration/asylum/citizenship, BAFU for environment, ARE for spatial planning, EPA for federal personnel law, SSK for inter-cantonal tax coordination). Returns ranked excerpts with the source authority, document number, date, and PDF URL. Essential complement to case-law search whenever the question involves administrative-law practice. Endpoint: https://mcp.opencaselaw.ch
- get_practice - Retrieve a single federal administrative-practice document by its doc_id (e.g. 'estv_ks_ks_nr_28', 'sem_weisungen_weisungen-aug-d'). Returns full body text, title, date, issuing authority, and PDF URL. Use search_practice first to discover the doc_id. Endpoint: https://mcp.opencaselaw.ch

## Resources
Not captured

## Prompts
Not captured

## Metadata
- Owner: ch.opencaselaw
- Version: 1.0.0
- Runtime: Sse
- Transports: HTTP
- License: Not captured
- Language: Not captured
- Stars: Not captured
- Updated: Mar 10, 2026
- Source: https://registry.modelcontextprotocol.io
