{
  "data": {
    "tool": {
      "category": "",
      "endpoint": "https://mcp.opencaselaw.ch/mcp",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/opencaselaw-swiss-caselaw.json",
      "kind": "mcp",
      "listed": "indexed",
      "liveUrl": "https://www.anchorterminal.com/api/v1/live/opencaselaw-swiss-caselaw.json",
      "markdownUrl": "https://www.anchorterminal.com/tools/opencaselaw-swiss-caselaw.md",
      "mcpTools": {
        "check": {
          "checker": "anchor-check/1.0",
          "totalTokens": 22229,
          "counts": {
            "error": 0,
            "note": 2,
            "warn": 7
          },
          "findings": [
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "get_article_history",
              "message": "1 parameter without a description: language",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC14",
              "severity": "warn",
              "tool": "get_legislation",
              "message": "allowed values are in the description, not an enum: systematic_number",
              "fix": "Move them into enum."
            },
            {
              "rule": "TC22",
              "severity": "warn",
              "tool": "cite",
              "message": "the definition is about 2,056 tokens",
              "fix": "Trim the description and parameter docs, or split the tool."
            },
            {
              "rule": "TC22",
              "severity": "warn",
              "tool": "get_decision",
              "message": "the definition is about 1,505 tokens",
              "fix": "Trim the description and parameter docs, or split the tool."
            },
            {
              "rule": "TC22",
              "severity": "warn",
              "tool": "get_law",
              "message": "the definition is about 1,966 tokens",
              "fix": "Trim the description and parameter docs, or split the tool."
            },
            {
              "rule": "TC22",
              "severity": "warn",
              "tool": "search_decisions",
              "message": "the definition is about 2,655 tokens",
              "fix": "Trim the description and parameter docs, or split the tool."
            },
            {
              "rule": "TC23",
              "severity": "warn",
              "message": "42 tools, about 22,255 tokens of definitions",
              "fix": "Split the server by job, or offer a smaller default toolset (a read-only set, or a search-then-call pattern)."
            },
            {
              "rule": "TC24",
              "severity": "note",
              "message": "32 of 42 tools have no outputSchema",
              "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
            },
            {
              "rule": "TC29",
              "severity": "note",
              "message": "about 1,312 tokens (5% of the definitions) are titles that repeat property or function names",
              "fix": "Strip \"title\" keys that only restate a name before listing tools."
            }
          ]
        },
        "checkedAt": "2026-10-04T22:21:25Z",
        "count": 42,
        "schemaTokens": 22229,
        "status": "ok",
        "tools": [
          {
            "name": "search",
            "title": "Search decisions (basic)",
            "description": "Minimal search tool following the deep-research search/fetch convention. Returns a ranked list of Swiss court decisions matching a query, each as {id, title, url, snippet}. Pair with `fetch` to retrieve a decision's full text by id. General (non-deep-research) clients should prefer `search_decisions`, which exposes filters (court, canton, date, language) and richer metadata.",
            "inputSchema": {
              "properties": {
                "limit": {
                  "default": 10,
                  "description": "Max results (default 10, max 50).",
                  "type": "integer"
                },
                "query": {
                  "description": "Natural-language or keyword query.",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "outputSchema": {
              "additionalProperties": true,
              "properties": {
                "results": {
                  "items": {
                    "additionalProperties": true,
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "snippet": {
                        "type": "string"
                      },
                      "title": {
                        "type": "string"
                      },
                      "url": {
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "type": "array"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "fetch",
            "title": "Fetch decision (basic)",
            "description": "Minimal fetch tool following the deep-research search/fetch convention. Fetches one Swiss decision's full text by id, returning {id, title, text, url, metadata}. The id comes from a `search` result (a decision_id like bger_6B_1234_2025; a docket number or BGE reference also resolves). General clients should prefer `get_decision`.",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Decision id from a search result (decision_id, docket, or BGE reference).",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "outputSchema": {
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string"
                },
                "metadata": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "text": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "search_decisions",
            "title": "Search decisions",
            "description": "Use this tool to find COURT DECISIONS (Rechtsprechung): 1,050,000+ Swiss federal and cantonal decisions plus ~2,800 ECtHR decisions concerning Switzerland. Full-text search with keywords, phrases (in quotes), Boolean operators (AND, OR, NOT), prefix matching (word*), docket lookup (6B_1234/2025) and column-scoped search (regeste:keyword). Filter by court, canton, language, date range, chamber. Results are relevance-ranked and enriched with citation counts, statute references and is_leading_case. Use offset to page. Most recent decisions: empty query + sort='date_desc' + court filter. Not for statutes (search_laws), commentary (search_scholarship), or administrative guidance (search_practice).",
            "inputSchema": {
              "properties": {
                "canton": {
                  "description": "Filter by canton (CH for federal, ZH, BE, GE, etc.)",
                  "type": "string"
                },
                "chamber": {
                  "description": "Filter by chamber/division (substring match). Examples: 'Abteilung V' (BVGer asylum), 'Zivilrechtliche', 'CASSO', 'Strafrechtliche'",
                  "type": "string"
                },
                "court": {
                  "description": "Filter by court code. Federal: bger, bge, bvger, bstger, bpatger, mkg. European Court of Human Rights: bge_egmr (BGE-published DE translations, Swiss cases), hudoc_ch (HUDOC Switzerland-tagged), ecthr_chamber and ecthr_grand_chamber (all respondent states, importance 1-3, FR or EN). ecthr_committee is empty by design — the Committee's docket is entirely importance 4. Cantonal: zh_obergericht, be_verwaltungsgericht, etc.",
                  "type": "string"
                },
                "date_from": {
                  "description": "Start date (YYYY-MM-DD)",
                  "type": "string"
                },
                "date_to": {
                  "description": "End date (YYYY-MM-DD)",
                  "type": "string"
                },
                "fields": {
                  "description": "Response detail level: 'full' (default) includes snippet/regeste/URL, 'compact' returns only docket, date, court, language, decision_id.",
                  "enum": [
                    "full",
                    "compact"
                  ],
                  "type": "string"
                },
                "include_pinpoint": {
                  "default": true,
                  "description": "Attach a pinpoint Erwägung citation to the top results when a confident match exists (BM25 over the per-decision Erwägungen FTS5 index, gap-confidence ≥ medium). Defaults true; set false to skip the per-result lookup (typically saves 0.2-2 s on the top 5 results; more for long or statute-heavy queries).",
                  "type": "boolean"
                },
                "language": {
                  "description": "OPTIONAL filter. Restricts results to ONE language. Omit (recommended default) to search across all languages — Swiss federal decisions are issued in DE, FR, or IT depending on the case, so a language filter silently excludes valid hits in the other two. Set ONLY when the user explicitly asks for a single-language result; do NOT auto-apply based on the conversation's language. 'en' reaches only ECtHR judgments whose sole authoritative text is English — there is no English Swiss case law.",
                  "enum": [
                    "de",
                    "fr",
                    "it",
                    "rm",
                    "en"
                  ],
                  "type": "string"
                },
                "limit": {
                  "default": 50,
                  "description": "Max results to return (max 2000). Omit to use default of 50. Do not set low values like 5 or 10 unless the user explicitly asked for fewer results.",
                  "type": "integer"
                },
                "marked_for_publication": {
                  "description": "If true, return only Federal Supreme Court rulings flagged for the official BGE collection (the Neuheiten '*' marker, 'für die Publikation vorgesehen') — future leading cases, flagged before the BGE number is assigned. Populated for BGer decisions published from mid-2026 onward; older rows are unflagged.",
                  "type": "boolean"
                },
                "offset": {
                  "default": 0,
                  "description": "Skip this many results (for pagination). Default 0.",
                  "type": "integer"
                },
                "query": {
                  "description": "Search query. Best results: 3-8 precise terms, one search per legal issue — never paste document text. Max 4,000 chars; input over 500 chars is auto-condensed to its citations + key terms. Examples:\n- Simple: Mietrecht Kündigung\n- Phrase: \"Treu und Glauben\"\n- Boolean: Arbeitsrecht AND Kündigung NOT Probezeit\n- Prefix: Verfassung*\n- By docket: 6B_1234/2025\n- By article: \"Art. 8 BV\"\n- Column: regeste:Mietrecht AND full_text:Kündigung",
                  "maxLength": 4000,
                  "type": "string"
                },
                "sort": {
                  "description": "Sort order: 'relevance' (default for FTS), 'date_desc', 'date_asc'.",
                  "enum": [
                    "relevance",
                    "date_desc",
                    "date_asc"
                  ],
                  "type": "string"
                }
              },
              "required": [],
              "type": "object"
            },
            "outputSchema": {
              "$defs": {
                "DecisionRecord": {
                  "additionalProperties": true,
                  "properties": {
                    "canonical_decision_id": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "The canonical decision_id when the representation manifest is loaded: equals decision_id unless this record is a duplicate representation of another stored decision. decision_id itself is never changed.",
                      "title": "Canonical Decision Id"
                    },
                    "canonical_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Canonical Url"
                    },
                    "canton": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Canton"
                    },
                    "citation_count": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation Count"
                    },
                    "citation_string_de": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String De"
                    },
                    "citation_string_fr": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String Fr"
                    },
                    "citation_string_it": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String It"
                    },
                    "content_hash": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Content Hash"
                    },
                    "court": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Court"
                    },
                    "date_is_estimated": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Date Is Estimated"
                    },
                    "decision_date": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Decision Date"
                    },
                    "decision_id": {
                      "title": "Decision Id",
                      "type": "string"
                    },
                    "docket_number": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Docket Number"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "is_canonical": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "Whether this record is the canonical representation (canonical_decision_id == decision_id). Absent when the manifest is not loaded.",
                      "title": "Is Canonical"
                    },
                    "is_leading_case": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Is Leading Case"
                    },
                    "joined_dockets": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "Secondary dockets of a consolidated proceeding stored under this decision; a reference by any of them names this record. Absent when there are none.",
                      "title": "Joined Dockets"
                    },
                    "language": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Language"
                    },
                    "markdown_link": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Markdown Link"
                    },
                    "pdf_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Pdf Url"
                    },
                    "pinpoint": {
                      "anyOf": [
                        {
                          "additionalProperties": true,
                          "type": "object"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Pinpoint"
                    },
                    "publication_date": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Publication Date"
                    },
                    "regeste": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Regeste"
                    },
                    "rule_statement": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Rule Statement"
                    },
                    "scraped_at": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Scraped At"
                    },
                    "snippet": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Snippet"
                    },
                    "source_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Source Url"
                    },
                    "title": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Title"
                    }
                  },
                  "required": [
                    "decision_id"
                  ],
                  "title": "DecisionRecord",
                  "type": "object"
                },
                "ResearchError": {
                  "additionalProperties": true,
                  "properties": {
                    "available_e_numbers": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Available E Numbers"
                    },
                    "error": {
                      "title": "Error",
                      "type": "string"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "message": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Message"
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "title": "ResearchError",
                  "type": "object"
                },
                "SearchDecisionsResponse": {
                  "additionalProperties": true,
                  "properties": {
                    "condensed_terms": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Condensed Terms"
                    },
                    "decisions": {
                      "anyOf": [
                        {
                          "items": {
                            "additionalProperties": true,
                            "type": "object"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "Legacy MCP widget records, retained alongside results.",
                      "title": "Decisions"
                    },
                    "degraded": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "True when the search hit its time budget and skipped ranking strategies; the page is a degraded ranking, not the best matches.",
                      "title": "Degraded"
                    },
                    "has_more": {
                      "description": "Whether another page is retrievable. False does not prove a relevance-ranked search enumerated the corpus.",
                      "title": "Has More",
                      "type": "boolean"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "limit": {
                      "title": "Limit",
                      "type": "integer"
                    },
                    "next_offset": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "title": "Next Offset"
                    },
                    "note": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Note"
                    },
                    "offset": {
                      "title": "Offset",
                      "type": "integer"
                    },
                    "query_condensed": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Query Condensed"
                    },
                    "result_set_id": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Result Set Id"
                    },
                    "results": {
                      "items": {
                        "$ref": "#/$defs/DecisionRecord"
                      },
                      "title": "Results",
                      "type": "array"
                    },
                    "returned": {
                      "title": "Returned",
                      "type": "integer"
                    },
                    "total": {
                      "description": "Match count; see total_is_lower_bound before treating it as exact.",
                      "title": "Total",
                      "type": "integer"
                    },
                    "total_is_lower_bound": {
                      "title": "Total Is Lower Bound",
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "total",
                    "total_is_lower_bound",
                    "results",
                    "returned",
                    "limit",
                    "offset",
                    "has_more",
                    "next_offset"
                  ],
                  "title": "SearchDecisionsResponse",
                  "type": "object"
                }
              },
              "anyOf": [
                {
                  "$ref": "#/$defs/SearchDecisionsResponse"
                },
                {
                  "$ref": "#/$defs/ResearchError"
                }
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_decision",
            "title": "Get decision",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "decision_id": {
                  "description": "Decision ID, docket number, or partial docket",
                  "type": "string"
                },
                "full_text": {
                  "default": true,
                  "description": "Include full text in response (default true). Set false to get only metadata and regeste.",
                  "type": "boolean"
                }
              },
              "required": [
                "decision_id"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$defs": {
                "DecisionResponse": {
                  "additionalProperties": true,
                  "properties": {
                    "canonical_decision_id": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "The canonical decision_id when the representation manifest is loaded: equals decision_id unless this record is a duplicate representation of another stored decision. decision_id itself is never changed.",
                      "title": "Canonical Decision Id"
                    },
                    "canonical_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Canonical Url"
                    },
                    "canton": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Canton"
                    },
                    "citation_count": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation Count"
                    },
                    "citation_string_de": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String De"
                    },
                    "citation_string_fr": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String Fr"
                    },
                    "citation_string_it": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String It"
                    },
                    "content_hash": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Content Hash"
                    },
                    "court": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Court"
                    },
                    "date_is_estimated": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Date Is Estimated"
                    },
                    "decision_date": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Decision Date"
                    },
                    "decision_id": {
                      "title": "Decision Id",
                      "type": "string"
                    },
                    "docket_number": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Docket Number"
                    },
                    "full_text": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "Stored decision text; omitted when full_text=false. MCP caps it at 200,000 characters and explicitly provides truncation metadata and a full REST URL when capped.",
                      "title": "Full Text"
                    },
                    "full_text_returned_chars": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Full Text Returned Chars"
                    },
                    "full_text_total_chars": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Full Text Total Chars"
                    },
                    "full_text_truncated": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Full Text Truncated"
                    },
                    "full_text_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "REST URL for the complete stored text when the MCP response is truncated; content_hash remains the stored source hash.",
                      "title": "Full Text Url"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "is_canonical": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "Whether this record is the canonical representation (canonical_decision_id == decision_id). Absent when the manifest is not loaded.",
                      "title": "Is Canonical"
                    },
                    "is_leading_case": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Is Leading Case"
                    },
                    "joined_dockets": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "Secondary dockets of a consolidated proceeding stored under this decision; a reference by any of them names this record. Absent when there are none.",
                      "title": "Joined Dockets"
                    },
                    "language": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Language"
                    },
                    "markdown_link": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Markdown Link"
                    },
                    "pdf_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Pdf Url"
                    },
                    "pinpoint": {
                      "anyOf": [
                        {
                          "additionalProperties": true,
                          "type": "object"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Pinpoint"
                    },
                    "publication_date": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Publication Date"
                    },
                    "recency_note": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Recency Note"
                    },
                    "regeste": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Regeste"
                    },
                    "rule_statement": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Rule Statement"
                    },
                    "scraped_at": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Scraped At"
                    },
                    "snippet": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Snippet"
                    },
                    "source_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Source Url"
                    },
                    "title": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Title"
                    }
                  },
                  "required": [
                    "decision_id"
                  ],
                  "title": "DecisionResponse",
                  "type": "object"
                },
                "ResearchError": {
                  "additionalProperties": true,
                  "properties": {
                    "available_e_numbers": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Available E Numbers"
                    },
                    "error": {
                      "title": "Error",
                      "type": "string"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "message": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Message"
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "title": "ResearchError",
                  "type": "object"
                }
              },
              "anyOf": [
                {
                  "$ref": "#/$defs/DecisionResponse"
                },
                {
                  "$ref": "#/$defs/ResearchError"
                }
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_decisions",
            "title": "Get decisions (batch)",
            "description": "Use this tool to fetch SEVERAL decisions at once (1-10 ids) instead of calling get_decision repeatedly. Same data per decision — canonical citation strings, Markdown link, Regeste, metadata — in ONE call. Prefer this whenever you are about to read more than one decision from a search result: it is the difference between one tool call and ten, which matters because clients cap tool calls per turn. full_text defaults to FALSE here (unlike get_decision) because ten full judgments exceed connector response limits; set it true only for a short id list, and each text is excerpted with the cut disclosed. Ids not found are reported individually — the rest of the batch still returns.",
            "inputSchema": {
              "properties": {
                "decision_ids": {
                  "description": "Decision ids, docket numbers or BGE references (e.g. ['bge_BGE_140_III_86', '6B_1234/2025']).",
                  "items": {
                    "type": "string"
                  },
                  "maxItems": 10,
                  "minItems": 1,
                  "type": "array"
                },
                "full_text": {
                  "default": false,
                  "description": "Include an excerpt of each decision's full text (default false — Regeste + metadata only).",
                  "type": "boolean"
                },
                "max_chars_per_decision": {
                  "default": 20000,
                  "description": "Per-decision text cap when full_text is true (default 20,000; total response stays under connector limits).",
                  "type": "integer"
                }
              },
              "required": [
                "decision_ids"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "list_courts",
            "title": "List courts",
            "description": "List all available courts with decision counts, date ranges, and language coverage. Use this to discover what data is available.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_statistics",
            "title": "Corpus statistics",
            "description": "Get aggregate statistics about the dataset. Optionally filter by court, canton, or year.",
            "inputSchema": {
              "properties": {
                "canton": {
                  "description": "Filter by canton code",
                  "type": "string"
                },
                "court": {
                  "description": "Filter by court code",
                  "type": "string"
                },
                "year": {
                  "description": "Filter by year",
                  "type": "integer"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "find_citations",
            "title": "Find citations",
            "description": "Given a decision_id, show what it cites and what cites it. Uses the reference graph database with 9.65M citation edges. Returns resolved citations with confidence scores and unresolved references.",
            "inputSchema": {
              "properties": {
                "decision_id": {
                  "description": "Decision ID (e.g., bger_6B_1_2025)",
                  "type": "string"
                },
                "direction": {
                  "default": "both",
                  "description": "Citation direction: 'both' (default), 'outgoing', or 'incoming'",
                  "enum": [
                    "both",
                    "outgoing",
                    "incoming"
                  ],
                  "type": "string"
                },
                "limit": {
                  "default": 50,
                  "description": "Max citations per direction per page (default 50, max 200)",
                  "type": "integer"
                },
                "min_confidence": {
                  "default": 0.3,
                  "description": "Minimum confidence score for resolved citations (0-1, default 0.3)",
                  "type": "number"
                },
                "offset": {
                  "default": 0,
                  "description": "Pagination offset per direction (default 0). The response reports *_total and *_has_more; when has_more is true, re-query with offset=next_offset to retrieve the rest (heavily-cited leading decisions exceed the 200-per-page cap).",
                  "type": "integer"
                }
              },
              "required": [
                "decision_id"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$defs": {
                "CitationEdge": {
                  "additionalProperties": true,
                  "properties": {
                    "confidence_score": {
                      "anyOf": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Confidence Score"
                    },
                    "court": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Court"
                    },
                    "decision_date": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Decision Date"
                    },
                    "docket_number": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Docket Number"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "mention_count": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Mention Count"
                    },
                    "source_decision_id": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Source Decision Id"
                    },
                    "target_decision_id": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Target Decision Id"
                    },
                    "target_ref": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Target Ref"
                    }
                  },
                  "title": "CitationEdge",
                  "type": "object"
                },
                "CitationsResponse": {
                  "additionalProperties": true,
                  "properties": {
                    "decision_id": {
                      "title": "Decision Id",
                      "type": "string"
                    },
                    "direction": {
                      "title": "Direction",
                      "type": "string"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "incoming": {
                      "anyOf": [
                        {
                          "items": {
                            "$ref": "#/$defs/CitationEdge"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Incoming"
                    },
                    "incoming_has_more": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Incoming Has More"
                    },
                    "incoming_returned": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Incoming Returned"
                    },
                    "incoming_total": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Incoming Total"
                    },
                    "limit": {
                      "title": "Limit",
                      "type": "integer"
                    },
                    "next_offset": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Next Offset"
                    },
                    "offset": {
                      "title": "Offset",
                      "type": "integer"
                    },
                    "outgoing": {
                      "anyOf": [
                        {
                          "items": {
                            "$ref": "#/$defs/CitationEdge"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Outgoing"
                    },
                    "outgoing_has_more": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Outgoing Has More"
                    },
                    "outgoing_returned": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Outgoing Returned"
                    },
                    "outgoing_total": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Outgoing Total"
                    }
                  },
                  "required": [
                    "decision_id",
                    "direction",
                    "limit",
                    "offset"
                  ],
                  "title": "CitationsResponse",
                  "type": "object"
                },
                "ResearchError": {
                  "additionalProperties": true,
                  "properties": {
                    "available_e_numbers": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Available E Numbers"
                    },
                    "error": {
                      "title": "Error",
                      "type": "string"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "message": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Message"
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "title": "ResearchError",
                  "type": "object"
                }
              },
              "anyOf": [
                {
                  "$ref": "#/$defs/CitationsResponse"
                },
                {
                  "$ref": "#/$defs/ResearchError"
                }
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "find_appeal_chain",
            "title": "Find appeal chain",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "decision_id": {
                  "description": "Decision ID (e.g., bger_6B_1_2025)",
                  "type": "string"
                },
                "min_confidence": {
                  "default": 0.3,
                  "description": "Minimum confidence score (0-1, default 0.3)",
                  "type": "number"
                }
              },
              "required": [
                "decision_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "find_leading_cases",
            "title": "Find leading cases",
            "description": "Find the most-cited decisions for a topic or statute. Authority ranking based on citation graph; a free-text topic ranks decisions whose regeste carries the query terms first (`regeste_match`: share of terms found, null without a regeste). 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 (surface it as 'E. \u003ce_number\u003e' when confidence is high or medium). Each result also carries citation_string_{de,fr,it} + canonical_url + is_leading_case + citation_count for ready-to-quote Swiss-format citations. A statute reference inside `query` (\"Art. 29 BV\") is used as the statute filter. When the query excludes every candidate, the page is relaxed to ranked OR and flagged `filters_relaxed: true` with a `note` — nearest neighbours, not on-point authority.",
            "inputSchema": {
              "properties": {
                "article": {
                  "description": "Optional article number (requires law_code)",
                  "type": "string"
                },
                "court": {
                  "description": "Optional court filter (e.g., bger, bge, bvger)",
                  "type": "string"
                },
                "date_from": {
                  "description": "Optional start date (YYYY-MM-DD)",
                  "type": "string"
                },
                "date_to": {
                  "description": "Optional end date (YYYY-MM-DD)",
                  "type": "string"
                },
                "include_pinpoint": {
                  "default": true,
                  "description": "Attach a pinpoint Erwägung citation to the top 3 leading cases when a confident match exists. Defaults true.",
                  "type": "boolean"
                },
                "law_code": {
                  "description": "Optional law code (e.g., BV, OR, ZGB, EMRK, StGB)",
                  "type": "string"
                },
                "limit": {
                  "default": 20,
                  "description": "Max results (default 20, max 100)",
                  "type": "integer"
                },
                "query": {
                  "description": "Optional text query to filter by topic (FTS search)",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "analyze_legal_trend",
            "title": "Analyze legal trend",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "article": {
                  "description": "Article number (requires law_code)",
                  "type": "string"
                },
                "court": {
                  "description": "Optional court filter",
                  "type": "string"
                },
                "date_from": {
                  "description": "Optional start date (YYYY-MM-DD)",
                  "type": "string"
                },
                "date_to": {
                  "description": "Optional end date (YYYY-MM-DD)",
                  "type": "string"
                },
                "law_code": {
                  "description": "Optional law code (e.g., BV, OR, EMRK). Requires article.",
                  "type": "string"
                },
                "query": {
                  "description": "Optional text query (FTS search)",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "draft_mock_decision",
            "title": "Draft mock decision",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "clarifications": {
                  "description": "Optional answers to prior clarification questions. Each item: {id, answer}. The tool withholds conclusion until high-priority clarifications are answered.",
                  "items": {
                    "properties": {
                      "answer": {
                        "type": "string"
                      },
                      "id": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "id",
                      "answer"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "deciding_court": {
                  "description": "Hypothetical deciding court (e.g., bger, bvger).",
                  "type": "string"
                },
                "facts": {
                  "description": "Detailed facts of the hypothetical or real case.",
                  "type": "string"
                },
                "fedlex_urls": {
                  "description": "Optional Fedlex URLs used to fetch statute text. Useful when no built-in URL mapping is available.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "limit": {
                  "default": 8,
                  "description": "Number of case-law exemplars (default 8, max 20).",
                  "type": "integer"
                },
                "preferred_language": {
                  "description": "Output/analysis language preference.",
                  "enum": [
                    "de",
                    "fr",
                    "it",
                    "rm",
                    "en"
                  ],
                  "type": "string"
                },
                "question": {
                  "description": "Optional legal question to decide.",
                  "type": "string"
                },
                "statute_references": {
                  "description": "Optional explicit statute list. Each item: {law_code, article, paragraph?}.",
                  "items": {
                    "properties": {
                      "article": {
                        "type": "string"
                      },
                      "law_code": {
                        "type": "string"
                      },
                      "paragraph": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "law_code",
                      "article"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                }
              },
              "required": [
                "facts"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_case_brief",
            "title": "Case brief",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "case": {
                  "description": "Any case reference: BGE ref ('BGE 133 III 121', '133 III 121'), decision_id ('bge_BGE_133_III_121'), or docket number.",
                  "type": "string"
                }
              },
              "required": [
                "case"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_decision_structure",
            "title": "Decision structure",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "decision_id": {
                  "description": "decision_id ('bger_5A_42_2026', 'bge_140 III 86'), BGE reference, or docket number.",
                  "type": "string"
                }
              },
              "required": [
                "decision_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_erwaegung",
            "title": "Get Erwägung (verbatim)",
            "description": "Verbatim text of ONE numbered Erwägung — the citable unit in Swiss practice (e.g. 'BGE 136 III 513 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', '4.1', '5.2.1', …",
            "inputSchema": {
              "properties": {
                "decision_id": {
                  "description": "decision_id, BGE reference, or docket number.",
                  "type": "string"
                },
                "e_number": {
                  "description": "Erwägung number to retrieve (e.g. '2', '2.3', '5.2.1'). Leading 'E.' is stripped if present.",
                  "type": "string"
                }
              },
              "required": [
                "decision_id",
                "e_number"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$defs": {
                "ErwaegungResponse": {
                  "additionalProperties": true,
                  "properties": {
                    "canonical_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Canonical Url"
                    },
                    "citation_string_de": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String De"
                    },
                    "citation_string_fr": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String Fr"
                    },
                    "citation_string_it": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String It"
                    },
                    "composed_of": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Composed Of"
                    },
                    "court": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Court"
                    },
                    "decision_id": {
                      "title": "Decision Id",
                      "type": "string"
                    },
                    "depth": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Depth"
                    },
                    "e_number": {
                      "title": "E Number",
                      "type": "string"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "language": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Language"
                    },
                    "markdown_link": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Markdown Link"
                    },
                    "parent_e_number": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Parent E Number"
                    },
                    "parts": {
                      "anyOf": [
                        {
                          "items": {
                            "$ref": "#/$defs/PassagePart"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Parts"
                    },
                    "rule_statement": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Rule Statement"
                    },
                    "siblings": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Siblings"
                    },
                    "text": {
                      "description": "Existing source text response; cross-references can contain Markdown links.",
                      "title": "Text",
                      "type": "string"
                    }
                  },
                  "required": [
                    "decision_id",
                    "e_number",
                    "text"
                  ],
                  "title": "ErwaegungResponse",
                  "type": "object"
                },
                "PassagePart": {
                  "additionalProperties": true,
                  "properties": {
                    "e_number": {
                      "title": "E Number",
                      "type": "string"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "text": {
                      "title": "Text",
                      "type": "string"
                    }
                  },
                  "required": [
                    "e_number",
                    "text"
                  ],
                  "title": "PassagePart",
                  "type": "object"
                },
                "ResearchError": {
                  "additionalProperties": true,
                  "properties": {
                    "available_e_numbers": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Available E Numbers"
                    },
                    "error": {
                      "title": "Error",
                      "type": "string"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "message": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Message"
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "title": "ResearchError",
                  "type": "object"
                }
              },
              "anyOf": [
                {
                  "$ref": "#/$defs/ErwaegungResponse"
                },
                {
                  "$ref": "#/$defs/ResearchError"
                }
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "find_relevant_erwaegung",
            "title": "Find relevant Erwägung",
            "description": "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 \u003cmark\u003e…\u003c/mark\u003e (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.",
            "inputSchema": {
              "properties": {
                "claim": {
                  "description": "Free-text legal claim or proposition the user wants to verify against the decision. The more specific, the higher the confidence.",
                  "type": "string"
                },
                "decision_id": {
                  "description": "decision_id, BGE reference, or docket number. Must be a federal decision (structured Erwägungen).",
                  "type": "string"
                },
                "top_k": {
                  "default": 3,
                  "description": "Number of top matches to return (default 3, max 10).",
                  "type": "integer"
                }
              },
              "required": [
                "decision_id",
                "claim"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_article_purpose",
            "title": "Article purpose (ratio legis)",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "article": {
                  "description": "Article number, e.g. '41' for Art. 41 OR. Letter-suffixed forms like '41a' supported.",
                  "type": "string"
                },
                "language": {
                  "default": "de",
                  "description": "Botschaft language (defaults to German).",
                  "enum": [
                    "de",
                    "fr",
                    "it"
                  ],
                  "type": "string"
                },
                "max_paragraphs": {
                  "default": 8,
                  "description": "Maximum paragraphs per Botschaft (default 8, max 20).",
                  "type": "integer"
                },
                "sr_number": {
                  "description": "SR (Systematische Rechtssammlung) number of the law, e.g. '220' for OR (Obligationenrecht), '101' for BV, '311.0' for StGB.",
                  "type": "string"
                }
              },
              "required": [
                "sr_number",
                "article"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "search_botschaft",
            "title": "Search Botschaft",
            "description": "Use this tool to retrieve and quote the VERBATIM text of Federal Council Botschaften (legislative messages). 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. When no paragraph carries every term, the page is relaxed to ranked OR and flagged `filters_relaxed: true` with a `note`.",
            "inputSchema": {
              "properties": {
                "language": {
                  "description": "OPTIONAL — only set when the user explicitly limits the search to one language. Leave unset to search the corpus the caller has (currently de only). Setting this without the user asking will hide all non-matching Botschaft passages.",
                  "enum": [
                    "de",
                    "fr",
                    "it"
                  ],
                  "type": "string"
                },
                "limit": {
                  "default": 20,
                  "description": "Max passages to return (default 20, max 50).",
                  "type": "integer"
                },
                "query": {
                  "description": "Search terms. FTS5 syntax supported — use quoted phrases for exact matches ('\"Vaterschaftsurlaub\"'), Boolean operators ('Klimaschutz AND Kanton'), and prefix queries ('Versicherungs*'). Stopwords are ignored.",
                  "type": "string"
                },
                "year_max": {
                  "description": "Latest publication year of the source Botschaft (inclusive).",
                  "type": "integer"
                },
                "year_min": {
                  "description": "Earliest publication year of the source Botschaft (inclusive) — scope legislative history to an era.",
                  "type": "integer"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_article_history",
            "title": "Article history",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "article": {
                  "description": "Article number, e.g. '41' for Art. 41 OR.",
                  "type": "string"
                },
                "language": {
                  "default": "de",
                  "enum": [
                    "de",
                    "fr",
                    "it"
                  ],
                  "type": "string"
                },
                "leading_cases_limit": {
                  "default": 5,
                  "description": "Max leading cases (default 5, max 15).",
                  "type": "integer"
                },
                "sr_number": {
                  "description": "SR number of the federal law, e.g. '220' for OR.",
                  "type": "string"
                }
              },
              "required": [
                "sr_number",
                "article"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_regeste",
            "title": "Get Regeste",
            "description": "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).",
            "inputSchema": {
              "properties": {
                "decision_id": {
                  "description": "decision_id, BGE reference, or docket number.",
                  "type": "string"
                }
              },
              "required": [
                "decision_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "check_claim_support",
            "title": "Check claim support",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "claim": {
                  "description": "The legal proposition you want to verify (e.g., 'A landlord is liable for fire-police violations under Art. 256 OR.').",
                  "type": "string"
                },
                "decision_id": {
                  "description": "Decision you intend to cite as authority.",
                  "type": "string"
                },
                "pinpoint": {
                  "description": "Optional Erwägung number ('2.3'). If given, only that paragraph is judged; more precise verdict.",
                  "type": "string"
                }
              },
              "required": [
                "claim",
                "decision_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "attest_response",
            "title": "Attest response",
            "description": "MANDATORY FINAL-STEP AUDIT of your draft answer. Checks five hallucination classes: (1) every case citation (BGE/BGer/BVGer/BStGer/BPatGer/MKGE, FR/IT forms) exists and any pinpoint (E. X.Y) resolves to a real Erwägung; (2) every 'Art. X LAW' statute reference resolves; (3) quoted passages (60-400 chars) near a citation or statute reference are verbatim in that source (DE/FR/IT; audit_quotes, on by default); (4) decision dates adjacent to citations match the stored dates; (5) with audit_grounding=true, an LLM judge checks that each cited source supports the preceding claim (one call, ~3 s). Returns the annotated draft, an issues list and a `ledger` (denominator per check). It certifies the draft's own citations, quotations and statute references; it does not certify that no relevant authority is missing. CALL THIS BEFORE emitting any answer with a case citation, statute reference or quotation; set audit_grounding=true for 2+ citations. If ok=false, fix each issue; if ok=true, send linked_text verbatim.",
            "inputSchema": {
              "properties": {
                "audit_grounding": {
                  "description": "When true, additionally runs the LLM-judge grounding rail: for each verified case citation in the draft, the preceding claim sentence is checked against the cited Erwägung / Regeste / text by an independent Sonnet judge. Catches the 'reasoning error' class (real citation, unsupported proposition). Adds ~3 s and one Sonnet call (~$0.005). Set to true for any answer with ≥2 citations or where a wrong proposition would mislead a Swiss lawyer.",
                  "type": "boolean"
                },
                "audit_quotes": {
                  "default": true,
                  "description": "Verifies that every quoted passage (60-400 chars) within ~250 chars of a case citation or an 'Art. X LAW' reference appears verbatim in the cited decision or in that statute article (DE/FR/IT). On by default since 2026-09-05 (0.0 % false positives measured on 3,964 statute paragraphs after the footnote fix). Pass false when the draft quotes material that is not a decision or a statute (party submissions, witness statements, contracts) to keep those quotes out of the audit.",
                  "type": "boolean"
                },
                "draft_text": {
                  "description": "Your draft response text.",
                  "type": "string"
                }
              },
              "required": [
                "draft_text"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "cite",
            "title": "Canonical citation",
            "description": "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. A pinpoint the decision does not contain returns pinpoint_valid=false plus the UNPINPOINTED citation_string — never re-append the rejected pinpoint to it.",
            "inputSchema": {
              "properties": {
                "language": {
                  "description": "Primary language for the citation_string field (all three variants always returned). Default: de.",
                  "enum": [
                    "de",
                    "fr",
                    "it"
                  ],
                  "type": "string"
                },
                "pinpoint": {
                  "description": "Optional Erwägung/consid. number ('2.3', '5.2.1'). Included in the citation and as a #e-2-3 URL anchor.",
                  "type": "string"
                },
                "reference": {
                  "description": "Any form of Swiss case reference: decision_id, BGE ref, or docket number. E.g. 'BGE 140 III 86', '4A_747/2012', 'bger_4A_747_2012', 'MKGE 16 Nr. 1'.",
                  "type": "string"
                }
              },
              "required": [
                "reference"
              ],
              "type": "object"
            },
            "outputSchema": {
              "$defs": {
                "CiteResponse": {
                  "additionalProperties": true,
                  "properties": {
                    "canonical_decision_id": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "Canonical decision_id of the resolved record when the representation manifest is loaded; decision_id is never changed.",
                      "title": "Canonical Decision Id"
                    },
                    "canonical_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Canonical Url"
                    },
                    "citation_string": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String"
                    },
                    "citation_string_de": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String De"
                    },
                    "citation_string_fr": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String Fr"
                    },
                    "citation_string_it": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String It"
                    },
                    "close_matches": {
                      "anyOf": [
                        {
                          "items": {
                            "$ref": "#/$defs/DecisionRecord"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Close Matches"
                    },
                    "decision_id": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Decision Id"
                    },
                    "exists": {
                      "description": "False is a completed lookup with no resolved reference, not a server error.",
                      "title": "Exists",
                      "type": "boolean"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "is_canonical": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "Whether the resolved record is the canonical representation; absent when the manifest is not loaded.",
                      "title": "Is Canonical"
                    },
                    "joined_dockets": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "Secondary dockets of the resolved consolidated proceeding; absent when there are none.",
                      "title": "Joined Dockets"
                    },
                    "markdown_link": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Markdown Link"
                    },
                    "queried": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Queried"
                    },
                    "resolved_id": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Resolved Id"
                    },
                    "rule_statement": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Rule Statement"
                    }
                  },
                  "required": [
                    "exists"
                  ],
                  "title": "CiteResponse",
                  "type": "object"
                },
                "DecisionRecord": {
                  "additionalProperties": true,
                  "properties": {
                    "canonical_decision_id": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "The canonical decision_id when the representation manifest is loaded: equals decision_id unless this record is a duplicate representation of another stored decision. decision_id itself is never changed.",
                      "title": "Canonical Decision Id"
                    },
                    "canonical_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Canonical Url"
                    },
                    "canton": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Canton"
                    },
                    "citation_count": {
                      "anyOf": [
                        {
                          "type": "integer"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation Count"
                    },
                    "citation_string_de": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String De"
                    },
                    "citation_string_fr": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String Fr"
                    },
                    "citation_string_it": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Citation String It"
                    },
                    "content_hash": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Content Hash"
                    },
                    "court": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Court"
                    },
                    "date_is_estimated": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Date Is Estimated"
                    },
                    "decision_date": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Decision Date"
                    },
                    "decision_id": {
                      "title": "Decision Id",
                      "type": "string"
                    },
                    "docket_number": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Docket Number"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "is_canonical": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "Whether this record is the canonical representation (canonical_decision_id == decision_id). Absent when the manifest is not loaded.",
                      "title": "Is Canonical"
                    },
                    "is_leading_case": {
                      "anyOf": [
                        {
                          "type": "boolean"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Is Leading Case"
                    },
                    "joined_dockets": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "Secondary dockets of a consolidated proceeding stored under this decision; a reference by any of them names this record. Absent when there are none.",
                      "title": "Joined Dockets"
                    },
                    "language": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Language"
                    },
                    "markdown_link": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Markdown Link"
                    },
                    "pdf_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Pdf Url"
                    },
                    "pinpoint": {
                      "anyOf": [
                        {
                          "additionalProperties": true,
                          "type": "object"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Pinpoint"
                    },
                    "publication_date": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Publication Date"
                    },
                    "regeste": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Regeste"
                    },
                    "rule_statement": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Rule Statement"
                    },
                    "scraped_at": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Scraped At"
                    },
                    "snippet": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Snippet"
                    },
                    "source_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Source Url"
                    },
                    "title": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Title"
                    }
                  },
                  "required": [
                    "decision_id"
                  ],
                  "title": "DecisionRecord",
                  "type": "object"
                },
                "ResearchError": {
                  "additionalProperties": true,
                  "properties": {
                    "available_e_numbers": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Available E Numbers"
                    },
                    "error": {
                      "title": "Error",
                      "type": "string"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "message": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Message"
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "title": "ResearchError",
                  "type": "object"
                }
              },
              "anyOf": [
                {
                  "$ref": "#/$defs/CiteResponse"
                },
                {
                  "$ref": "#/$defs/ResearchError"
                }
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_doctrine",
            "title": "Get doctrine",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "query": {
                  "description": "Statute article ('Art. 41 OR', 'Art. 8 BV') or legal concept ('Tierhalterhaftung', 'culpa in contrahendo'). German preferred.",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "generate_exam_question",
            "title": "Generate exam question",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "exclude_ids": {
                  "description": "decision_ids already used in this session — avoids repetition.",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "topic": {
                  "description": "Legal area, statute, or concept. Examples: 'Haftpflichtrecht', 'Art. 41 OR', 'Mietrecht', 'Strafrecht', 'Vertragsrecht'.",
                  "type": "string"
                }
              },
              "required": [
                "topic"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_law",
            "title": "Get law",
            "description": "AUTHORITATIVE LOOKUP for the text of any Swiss law article — federal OR cantonal — from two local mirrors. Federal (canton='CH', default): Fedlex mirror, all federal acts (OR, ZGB, StGB, ZPO, StPO, BV, SchKG, BGG, DBG, AIG, BVG, KVG …) in DE/FR/IT; names match in any language, case, dots or spaces (Cst, OPP2), treaties by common name (IPBPR, KRK, CISG) and former names (OG → BGG, noted; as_of gives the old edition). Cantonal: LexFind mirror, every act of all 26 cantons in the canton's language; name it 'ZH/StG' or pass canton. Use this BEFORE relying on training-data recall — statute text changes often and LLMs hallucinate article content. With as_of: the dated Fedlex edition in force on that date (snapshot_date, in-force window, link); always tell the user the edition date. PDF-only editions carry `text_status` 'heading_only' / 'empty' = no article text recovered; say so and give the Fedlex link. Examples: get_law(abbreviation='BV', article='8'); get_law(canton='ZH', sr_number='554.5', article='1').",
            "inputSchema": {
              "properties": {
                "abbreviation": {
                  "description": "Law abbreviation in DE, FR or IT ('BV'/'Cst'/'Cost', 'OR'/'CO', 'ZGB'/'CC', 'StGB'/'CP', 'BGG'/'LTF', 'OPP 2'), a treaty's common name ('EMRK', 'IPBPR', 'KRK', 'LugÜ', 'CISG') or a former name ('OG', 'AuG', 'aStGB' — served as the current act with a note). Case, dots and spaces do not matter. Cantonal: 'ZH/StG' or 'StG/ZH' (the canton is part of the name; many cantonal acts have no abbreviation — use sr_number or search_laws).",
                  "type": "string"
                },
                "article": {
                  "description": "Article number to retrieve (e.g., '8', '41a', '1bis'). For cantonal § laws (ZH, SH, AI, AR, BS, BL, AG), pass the § number without the § sign. If omitted, returns the full article list.",
                  "type": "string"
                },
                "as_of": {
                  "description": "Past date, ISO 'YYYY-MM-DD' (or Swiss 'DD.MM.YYYY'), to retrieve the HISTORICAL edition of a federal law in force on that date. The response names the edition (snapshot_date), the act's title and in-force window and links the Fedlex edition; always report the edition date to the user. Federal laws only (rejected for cantons). Fedlex publishes machine-readable text for most acts only for editions of the 2010s and later; an older edition returns an error naming the formats Fedlex has for it.",
                  "pattern": "^(\\d{4}-\\d{2}-\\d{2}|\\d{1,2}\\.\\d{1,2}\\.\\d{4})$",
                  "type": "string"
                },
                "canton": {
                  "default": "CH",
                  "description": "Two-letter canton code (ZH, BE, LU, …) or 'CH' for federal. Default 'CH' preserves backward compat.",
                  "type": "string"
                },
                "language": {
                  "default": "de",
                  "description": "Language for article text: de, fr, it. For cantonal laws, must match the canton's publication language (fr for FR/GE/JU/NE/VD, it for TI, de otherwise).",
                  "enum": [
                    "de",
                    "fr",
                    "it"
                  ],
                  "type": "string"
                },
                "sr_number": {
                  "description": "Statute number. Federal: SR number ('210'=ZGB, '220'=OR, '101'=BV). Cantonal: the canton's systematic number — e.g. ZH 'LS' number '554.5' (Hundegesetz), '550.1' (Polizeigesetz). The `systematic_number` alias (as used by get_legislation) is also accepted.",
                  "type": "string"
                },
                "systematic_number": {
                  "description": "Alias for sr_number — the cantonal-friendly name (LS / systematic number), matching get_legislation. Either field works.",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "outputSchema": {
              "$defs": {
                "LawArticle": {
                  "additionalProperties": true,
                  "properties": {
                    "article_num": {
                      "title": "Article Num",
                      "type": "string"
                    },
                    "heading": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Heading"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "section": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Section"
                    },
                    "section_heading": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Section Heading"
                    },
                    "text": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "Article text; a whole-law table of contents can omit it.",
                      "title": "Text"
                    },
                    "text_status": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "ok, heading_only or empty for a historical PDF edition: heading_only/empty means no article text was recovered.",
                      "title": "Text Status"
                    },
                    "xml": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Xml"
                    }
                  },
                  "required": [
                    "article_num"
                  ],
                  "title": "LawArticle",
                  "type": "object"
                },
                "LawResponse": {
                  "additionalProperties": true,
                  "properties": {
                    "abbreviation": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Abbreviation"
                    },
                    "articles": {
                      "anyOf": [
                        {
                          "items": {
                            "$ref": "#/$defs/LawArticle"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Articles"
                    },
                    "as_of": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "As Of"
                    },
                    "canton": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Canton"
                    },
                    "consolidation_date": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Consolidation Date"
                    },
                    "fedlex_snapshot_uri": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Fedlex Snapshot Uri"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "language": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Language"
                    },
                    "level": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Level"
                    },
                    "pending_changes": {
                      "anyOf": [
                        {
                          "items": {
                            "additionalProperties": true,
                            "type": "object"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Pending Changes"
                    },
                    "snapshot_date": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Snapshot Date"
                    },
                    "source_label": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Source Label"
                    },
                    "source_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Source Url"
                    },
                    "sr_number": {
                      "title": "Sr Number",
                      "type": "string"
                    },
                    "text_source": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Text Source"
                    },
                    "text_status": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "ok, heading_only or empty (historical PDF editions); heading_only/empty means no article text was recovered.",
                      "title": "Text Status"
                    },
                    "title": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Title"
                    },
                    "verbatim_quotation": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Verbatim Quotation"
                    },
                    "version": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Version"
                    },
                    "work_entry_in_force": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Work Entry In Force"
                    },
                    "work_no_longer_in_force": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Work No Longer In Force"
                    },
                    "work_uri": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Work Uri"
                    }
                  },
                  "required": [
                    "sr_number"
                  ],
                  "title": "LawResponse",
                  "type": "object"
                },
                "ResearchError": {
                  "additionalProperties": true,
                  "properties": {
                    "available_e_numbers": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Available E Numbers"
                    },
                    "error": {
                      "title": "Error",
                      "type": "string"
                    },
                    "ignored_arguments": {
                      "anyOf": [
                        {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "description": "MCP parameters that were ignored; they did not affect the returned result.",
                      "title": "Ignored Arguments"
                    },
                    "message": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "default": null,
                      "title": "Message"
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "title": "ResearchError",
                  "type": "object"
                }
              },
              "anyOf": [
                {
                  "$ref": "#/$defs/LawResponse"
                },
                {
                  "$ref": "#/$defs/ResearchError"
                }
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "search_laws",
            "title": "Search laws",
            "description": "Use this tool to find STATUTE ARTICLES by topic — full-text over every locally indexed article, federal (Fedlex mirror) AND cantonal (LexFind mirror, all 26 cantons), interleaved. Not for whole laws by name (search_legislation) or court decisions (search_decisions). 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.",
            "inputSchema": {
              "properties": {
                "canton": {
                  "description": "Two-letter canton code (ZH, BE, …) to restrict to one canton's statute corpus. 'CH' → federal only. Omit to search every jurisdiction.",
                  "type": "string"
                },
                "jurisdiction": {
                  "default": "all",
                  "description": "Explicit scope override: 'all' (default), 'federal', or 'cantonal'. Most callers should omit this and let sr_number/canton drive the scope.",
                  "enum": [
                    "all",
                    "federal",
                    "cantonal"
                  ],
                  "type": "string"
                },
                "language": {
                  "description": "OPTIONAL filter. Restricts results to ONE language. Omit (recommended default) to search across all three official languages — most laws exist in DE/FR/IT and a filter silently hides valid hits in the others. Set ONLY when the user explicitly asks for one language.",
                  "enum": [
                    "de",
                    "fr",
                    "it"
                  ],
                  "type": "string"
                },
                "limit": {
                  "default": 10,
                  "description": "Maximum merged results (1-50).",
                  "type": "integer"
                },
                "query": {
                  "description": "Search query. Explicit syntax is supported and operators must be UPPERCASE: 'Miete OR Pacht', 'Kündigung AND Frist' (AND with an absent term returns 0), '\"exakte Wortfolge\"' for phrases, 'Verfahr*' for prefixes. Lowercase or/and are treated as ordinary words.",
                  "type": "string"
                },
                "sr_number": {
                  "description": "Restrict search to a specific federal law by SR number. Implies jurisdiction='federal'.",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "outputSchema": {
              "additionalProperties": true,
              "properties": {
                "cantonal_hits": {
                  "type": "integer"
                },
                "federal_hits": {
                  "type": "integer"
                },
                "hits": {
                  "items": {
                    "additionalProperties": true,
                    "properties": {
                      "abbreviation": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "article_num": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "canton": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "level": {
                        "type": "string"
                      },
                      "reference": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "snippet_text": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "source_label": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "source_url": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "sr_number": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "title": {
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    },
                    "type": "object"
                  },
                  "type": "array"
                },
                "query": {
                  "type": "string"
                },
                "total": {
                  "type": "integer"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_commentary",
            "title": "Get commentary",
            "description": "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. Cantonal: the Kommentar zur Schaffhauser Verwaltungsrechtspflege (Meyer/Herrmann/Bilger, 2021; CC BY-SA text) for the Schaffhausen VRG (SHR 172.200) and JG (SHR 173.200), article by article with margin numbers — pass canton='SH' and abbreviation 'VRG' or 'JG' (or 'SH/VRG'). Where no commentary exists (most provisions: the corpus holds only the open-access OnlineKommentar.ch / OpenLegalCommentary.ch commentaries) the answer is flagged `found: false` / `no_commentary: true` and lists what the corpus holds on the provision instead — `leading_cases`, a `doctrine` excerpt, `scholarship_citing_statute` — none of which is commentary.",
            "inputSchema": {
              "properties": {
                "abbreviation": {
                  "description": "Law abbreviation (e.g., 'OR', 'BV', 'ZGB', 'StGB'). Preferred over sr_number.",
                  "type": "string"
                },
                "article": {
                  "description": "Article number (e.g., '41', '8'). Omit to list available articles.",
                  "type": "string"
                },
                "canton": {
                  "description": "Two-letter canton code for a cantonal act (e.g. 'SH' with abbreviation 'VRG' or 'JG'). Omit for federal law.",
                  "type": "string"
                },
                "language": {
                  "default": "de",
                  "description": "Preferred language (de, en, fr, it). Falls back to de if unavailable.",
                  "type": "string"
                },
                "sr_number": {
                  "description": "SR number of the law (e.g., '220' for OR). Use if abbreviation unknown.",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "search_commentaries",
            "title": "Search commentaries",
            "description": "Use this tool ONLY for article-anchored commentary — doctrinal discussion tied to a specific statute article: OnlineKommentar.ch / OpenLegalCommentary.ch (federal law) and the Kommentar zur Schaffhauser Verwaltungsrechtspflege (Schaffhausen VRG and JG; abbreviation 'VRG SH' / 'JG SH'). For the full OA scholarship corpus (which includes all of these) use search_scholarship. Searches commentary text, titles, and article numbers. Returns ranked results with snippets, authors, links and each hit's source. Useful for finding doctrinal discussion of a legal concept across multiple laws.",
            "inputSchema": {
              "properties": {
                "abbreviation": {
                  "description": "Filter by law abbreviation (e.g., 'OR', 'StGB'; 'VRG SH' or 'JG SH' for the Schaffhausen commentary).",
                  "type": "string"
                },
                "language": {
                  "description": "OPTIONAL filter (de/fr/it/en). Omit (recommended default) to search across all languages. Set ONLY when the user explicitly asks for one-language results; do NOT auto-apply based on conversation language.",
                  "type": "string"
                },
                "limit": {
                  "default": 10,
                  "description": "Maximum results (1-50, default 10).",
                  "type": "integer"
                },
                "query": {
                  "description": "Search query (supports FTS5 syntax: quotes for phrases, OR for alternatives).",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "search_scholarship",
            "title": "Search scholarship",
            "description": "Use this tool for open-access SCHOLARSHIP (Lehre): OA journal articles (sui generis et al.), OA legal commentaries (OnlineKommentar, OpenLegalCommentary — this tool SUBSUMES search_commentaries), dissertations and theses from Swiss university repositories, and federal legal-policy reports. Returns ranked results with snippets, authors, DOI, and direct links. Filters by source, publication type, language, and year range. Sort by relevance or year; an author filter may be used on its own (no query) for a bibliographic browse, e.g. all works by a given author, newest first.",
            "inputSchema": {
              "properties": {
                "author": {
                  "description": "Filter by author (substring match on the authors field). May be used WITHOUT a query for a pure bibliographic browse (all works by an author).",
                  "type": "string"
                },
                "language": {
                  "description": "OPTIONAL filter by language (de/fr/it/en). Omit to search across all languages (recommended — the corpus is trilingual).",
                  "type": "string"
                },
                "limit": {
                  "default": 10,
                  "description": "Maximum results (1-50, default 10).",
                  "type": "integer"
                },
                "pub_type": {
                  "description": "Filter by type: 'article', 'commentary', 'dissertation', 'book', 'chapter', 'master_thesis', 'working_paper', 'report'.",
                  "type": "string"
                },
                "query": {
                  "description": "Topic query (FTS5 syntax: quotes for phrases, OR for alternatives). Optional — may be omitted when an `author` (or other) filter is given, which returns a bibliographic browse instead of a topical search.",
                  "type": "string"
                },
                "sort": {
                  "description": "Order: 'relevance' (BM25, default for a topic query), 'year' (newest first), 'year_asc' (oldest first). With no query the default is newest-first.",
                  "enum": [
                    "relevance",
                    "year",
                    "year_asc"
                  ],
                  "type": "string"
                },
                "source": {
                  "description": "Filter by source slug (e.g. 'sui_generis', 'onlinekommentar', 'openlegalcommentary', 'zora_law').",
                  "type": "string"
                },
                "year_max": {
                  "description": "Latest publication year.",
                  "type": "integer"
                },
                "year_min": {
                  "description": "Earliest publication year.",
                  "type": "integer"
                }
              },
              "required": [],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_scholarship",
            "title": "Get scholarship record",
            "description": "Fetch a single OA legal publication (article, dissertation, commentary, etc.) by its pub_id. Returns full metadata + abstract + full text if available + cross-citations to statutes and decisions.",
            "inputSchema": {
              "properties": {
                "pub_id": {
                  "description": "Canonical pub_id, e.g. 'sui_generis:article-1382' or 'onlinekommentar:\u003cuuid\u003e'.",
                  "type": "string"
                }
              },
              "required": [
                "pub_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "find_scholarship_citing_statute",
            "title": "Scholarship citing statute",
            "description": "Find OA legal scholarship that cites a given Swiss statute article. Sourced from article-anchored commentaries (OnlineKommentar / OpenLegalCommentary) PLUS full-text citation extraction across the open-access journal corpus (~90k statute references resolved from 9k full-text records).",
            "inputSchema": {
              "properties": {
                "article": {
                  "description": "Article number (e.g. '41'). Omit for all articles of the law.",
                  "type": "string"
                },
                "limit": {
                  "default": 20,
                  "description": "Maximum results (1-100, default 20).",
                  "type": "integer"
                },
                "sr_number": {
                  "description": "Swiss SR number (e.g. '220' for OR, '210' for ZGB).",
                  "type": "string"
                }
              },
              "required": [
                "sr_number"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "find_scholarship_citing_decision",
            "title": "Scholarship citing decision",
            "description": "Find OA legal scholarship that cites a specific Swiss court decision. Reverse direction of the scholarship↔caselaw bridge: given a decision_id (e.g. 'bge_BGE_140_III_86' or 'bger_4A_571_2008'), return open-access publications that cite it in their full text. Citations are extracted deterministically by regex + lookup against the canonical decision corpus, so resolved citations are always to decisions we hold.",
            "inputSchema": {
              "properties": {
                "decision_id": {
                  "description": "Canonical decision_id (e.g. 'bge_BGE_140_III_86', 'bger_4A_571_2008').",
                  "type": "string"
                },
                "limit": {
                  "default": 20,
                  "description": "Maximum results (1-100, default 20).",
                  "type": "integer"
                }
              },
              "required": [
                "decision_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "list_scholarship_sources",
            "title": "List scholarship sources",
            "description": "List the open-access legal scholarship sources currently indexed, with publication counts by source, type, and language. Use this to discover what corpora are available before searching.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_scholarship_full_text",
            "title": "Scholarship full text",
            "description": "Fetch the full text of an OA legal publication by pub_id, on demand. Cached after first fetch so subsequent calls are instant. License-gated: only records under CC-BY-* (except CC-BY-ND), OA-Swiss-federal, or OA-author-permitted-reuse are extracted. ND/all-rights-reserved records return the upstream URL only. Use this when search_scholarship or get_scholarship returns only abstract/title and you need the article body to verify a claim or quote a passage.",
            "inputSchema": {
              "properties": {
                "pub_id": {
                  "description": "Canonical pub_id (from search_scholarship results).",
                  "type": "string"
                }
              },
              "required": [
                "pub_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_materialien",
            "title": "Get Materialien",
            "description": "Look up Materialien for a Swiss federal law article. Returns up to three things: `sources` = per-article digests of legislative intent (BV and BGFA only — 167 articles); `botschaft_documents` = the Federal Council messages that concern this article, with BBl citation, title and Fedlex link (620 SR numbers, 19,809 article links); `amendment_refs` = the AS/BBl publication locators from the statute's own footnotes. Empty `sources` means no digest exists for that law, NOT that the law has no legislative history — read `botschaft_documents` and cite the BBl reference. For full text of a message use search_botschaft. A provision with nothing keyed to it is flagged `found: false` / `no_materialien: true` and lists `leading_cases`, a `doctrine` excerpt and `scholarship_citing_statute` instead — none of it is legislative history.",
            "inputSchema": {
              "properties": {
                "article": {
                  "description": "Article number (e.g., '1', '8', '10a'). Omit to get all articles.",
                  "type": "string"
                },
                "law_code": {
                  "description": "Law abbreviation (e.g., 'BV', 'BGFA', 'OR', 'StGB').",
                  "type": "string"
                }
              },
              "required": [
                "law_code"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "search_materialien",
            "title": "Search Materialien",
            "description": "Use this tool for DIGESTED legislative history — per-article intent summaries and key arguments, not verbatim text. COVERAGE IS NARROW: BV and BGFA digests (167 articles) plus BV debate transcripts, and nothing else. For any other law this returns 0 hits, which means 'outside this index', not 'no materials exist'. Prefer search_botschaft, which covers all 6,154 Federal Council messages verbatim, or get_materialien(law_code) for the messages linked to one statute.",
            "inputSchema": {
              "properties": {
                "law_code": {
                  "description": "Filter by law abbreviation (e.g., 'BGFA').",
                  "type": "string"
                },
                "limit": {
                  "default": 10,
                  "description": "Maximum results (1-50, default 10).",
                  "type": "integer"
                },
                "query": {
                  "description": "Search query (natural language or FTS5 syntax).",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "search_legislation",
            "title": "Search legislation",
            "description": "Use this tool to find WHOLE LAWS by name or subject — 33,000+ federal and cantonal enactments from LexFind.ch; the entry point for cantonal questions ('Hundegesetz Bern', 'loi sur l'énergie Vaud'). Not for article-level topic search (search_laws) or the core federal codes (get_law is instant there). All 26 cantons + federal, DE/FR/IT. Also the entry point for municipal regulations and federal ordinances outside the core Fedlex mirror. 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.",
            "inputSchema": {
              "properties": {
                "active_only": {
                  "default": true,
                  "description": "Only show laws currently in force (default true).",
                  "type": "boolean"
                },
                "canton": {
                  "description": "Two-letter canton code (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) or 'CH' for federal. Omit to search all 26 cantons + federal at once.",
                  "type": "string"
                },
                "fetch_top_n_texts": {
                  "default": 0,
                  "description": "If \u003e 0, download + parse the full text of the top N results (max 10) and return each with full_text_preview, article_count, and sample_articles. Use 1-3 for natural-language questions so you can answer in a single tool call.",
                  "type": "integer"
                },
                "language": {
                  "description": "OPTIONAL filter. Restricts results to ONE language version. Omit (recommended default) to fan out across DE/FR/IT and merge results — LexFind's API is single-language per request, so omission triggers a 3-way parallel call with deduplication. Set ONLY when the user explicitly asks for one language. Hint when set: fr for FR/GE/JU/NE/VD, it for TI, de for the rest.",
                  "enum": [
                    "de",
                    "fr",
                    "it"
                  ],
                  "type": "string"
                },
                "limit": {
                  "default": 20,
                  "description": "Max results (1-60, default 20).",
                  "type": "integer"
                },
                "query": {
                  "description": "Search query in natural language or keywords. Examples: 'Hundegesetz', 'loi sur l'énergie', 'Mietrecht Kanton Zürich', 'Baugesetz'.",
                  "type": "string"
                },
                "search_in_content": {
                  "default": false,
                  "description": "Also search inside the law text, not just titles and keywords (slower).",
                  "type": "boolean"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "outputSchema": {
              "additionalProperties": true,
              "properties": {
                "hits": {
                  "items": {
                    "additionalProperties": true,
                    "type": "object"
                  },
                  "type": "array"
                },
                "query": {
                  "type": "string"
                },
                "total": {
                  "type": "integer"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_legislation",
            "title": "Get legislation",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "canton": {
                  "default": "CH",
                  "description": "Canton for systematic number lookup (default CH). Required for cantonal laws.",
                  "type": "string"
                },
                "include_versions": {
                  "default": false,
                  "description": "Include full version history (default false).",
                  "type": "boolean"
                },
                "language": {
                  "default": "de",
                  "description": "Result language: de, fr, it.",
                  "enum": [
                    "de",
                    "fr",
                    "it"
                  ],
                  "type": "string"
                },
                "lexfind_id": {
                  "description": "LexFind ID of the law (from search_legislation results). Positive integer; omit it when unknown rather than passing 0.",
                  "type": "integer"
                },
                "systematic_number": {
                  "description": "SR/systematic number (e.g., '220' for OR, '210' for ZGB). Used when lexfind_id not available. One of lexfind_id or systematic_number is required.",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "browse_legislation_changes",
            "title": "Browse legislation changes",
            "description": "Browse recent legislation changes for a canton or federal level. Shows new laws, amendments, and abrogations with dates.",
            "inputSchema": {
              "properties": {
                "canton": {
                  "default": "CH",
                  "description": "Canton code (CH for federal, ZH, BE, etc.). Default: CH.",
                  "type": "string"
                },
                "language": {
                  "description": "OPTIONAL filter. Restricts results to ONE language version. Omit (recommended default) to fan out across DE/FR/IT and merge results — LexFind's API is single-language per request, so omission triggers a 3-way parallel call with deduplication. Set ONLY when the user explicitly asks for one language.",
                  "enum": [
                    "de",
                    "fr",
                    "it"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "search_practice",
            "title": "Search administrative practice",
            "description": "Use this tool when the question involves federal ADMINISTRATIVE PRACTICE (Verwaltungspraxis): Wegleitungen, Kreisschreiben, Weisungen, Rundschreiben — agency guidance, not court decisions. 9,900+ documents. Covered: BSV (AHV/IV/EL/EO/FamZ/BVG Wegleitungen, Kreisschreiben, Mitteilungen, every version), OAK BV (BVG Weisungen, Mitteilungen, drafts), WEKO (Bekanntmachungen, Erläuterungen, all versions), SECO (ArG commentary, AVIG-Praxis), BAG (KVG Kreisschreiben), SEM (Weisungen AIG/Asyl/BüG, Handbuch Asyl), BJ (SchKG Weisungen, Existenzminimum), FINMA, ESTV, BAFU; counts in the filter enums. Returns ranked excerpts with authority, number, date, PDF link. Superseded versions collapse to the newest per document; for past conduct pass include_superseded=true and take the version dated before the facts. NOT covered: cantonal administrations — Sozialhilfe (SKOS, cantonal Handbücher), Prämienverbilligung (IPV) — say so, do not imply absence of guidance. Pre-2017 federal decisions: search_decisions(court='ch_vb').",
            "inputSchema": {
              "properties": {
                "doc_type": {
                  "description": "Filter by document type. wegleitung (SECO ArG 1,102 + BSV WEL/RWL…), rundschreiben (FINMA 1,017 + BSV/SEM), vollzugshilfe (297), kreisschreiben (ESTV 285 + BSV/BAG/BJ), rundschreiben_anhang (132 — FINMA circular annexes), mwst_branchen_info (84), weisung (SEM/SECO-ALV/BJ/BSV), mwst_info (69), handbuch (SEM Handbuch Asyl), mitteilung (BSV Mitteilungen an die Ausgleichskassen), nachtrag (BSV Nachträge), rechtsprechung (BSV AHI-Praxis digests), richtlinie (BJ, WEKO Richtlinien), weisung_anhang (BJ; OAK BV Informationsschreiben/FAQ), konkordat / erlass (BJ SchKG page), bekanntmachung / erlaeuterung (WEKO), entwurf (OAK BV Anhörungen: drafts, not in force).",
                  "enum": [
                    "wegleitung",
                    "rundschreiben",
                    "vollzugshilfe",
                    "kreisschreiben",
                    "rundschreiben_anhang",
                    "mwst_branchen_info",
                    "mwst_info",
                    "weisung",
                    "handbuch",
                    "mitteilung",
                    "nachtrag",
                    "rechtsprechung",
                    "richtlinie",
                    "weisung_anhang",
                    "konkordat",
                    "erlass",
                    "bekanntmachung",
                    "erlaeuterung",
                    "entwurf"
                  ],
                  "type": "string"
                },
                "include_superseded": {
                  "default": false,
                  "description": "Return every retained version of a document (FINMA, BSV) instead of collapsing to the newest. Set for point-in-time questions.",
                  "type": "boolean"
                },
                "issuing_authority": {
                  "description": "Filter by authority. FINMA (1,133), SECO (Arbeitsgesetz 1,102 + AVIG-Praxis), ESTV (438), BAFU (297), SEM (Weisungen 92 + Handbuch), BSV (6,083, social insurance practice), BAG (38), BJ (debt enforcement), WEKO (Bekanntmachungen/Erläuterungen under the KG), OAK BV (BVG supervision: Weisungen, Mitteilungen).",
                  "enum": [
                    "FINMA",
                    "SECO",
                    "ESTV",
                    "BAFU",
                    "SEM",
                    "BSV",
                    "BAG",
                    "BJ",
                    "WEKO",
                    "OAK BV"
                  ],
                  "type": "string"
                },
                "language": {
                  "description": "OPTIONAL filter (de/fr/it). Omit (recommended default) to search across all languages. Set ONLY when the user explicitly asks for one-language results.",
                  "type": "string"
                },
                "limit": {
                  "default": 10,
                  "description": "Maximum results (1-50, default 10).",
                  "type": "integer"
                },
                "query": {
                  "description": "Search query (FTS5 syntax: quotes for phrases, OR for alternatives, NEAR(term1 term2, N) for proximity).",
                  "type": "string"
                },
                "source": {
                  "description": "Filter by source key. finma_rs (1,133), seco_arg (1,102), bafu_vollzug (297), estv_ks (285), estv_mwst (153), sem_weisungen (92), bsv_weisungen (BSV Wegleitungen/Kreisschreiben/Rundschreiben/Mitteilungen, every retained version, 6,083, DE/FR/IT), seco_alv (AVIG-Praxis ALE/KAE/SWE/RVEI/IE/AMM + thematic Weisungen, 54, DE/FR/IT), bag_kvg (KVG Kreisschreiben, 38, DE/FR), sem_handbuch_asyl (Handbuch Asyl und Rückkehr, 92 articles, DE/FR), bj_schkg (SchKG Weisungen + cantonal and historical federal Kreisschreiben incl. Existenzminimum-Richtlinien, 174, DE/FR/IT), weko_bekanntmachungen (WEKO Bekanntmachungen + Erläuterungen, current and superseded versions, DE/FR/IT), oak_bv (OAK BV Weisungen W and Mitteilungen M, every version, Informationsschreiben/FAQ, Anhörungsentwürfe, DE/FR/IT).",
                  "enum": [
                    "finma_rs",
                    "seco_arg",
                    "bafu_vollzug",
                    "estv_ks",
                    "estv_mwst",
                    "sem_weisungen",
                    "bsv_weisungen",
                    "seco_alv",
                    "bag_kvg",
                    "sem_handbuch_asyl",
                    "bj_schkg",
                    "weko_bekanntmachungen",
                    "oak_bv"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_practice",
            "title": "Get administrative practice",
            "description": "Retrieve a single federal administrative-practice document by its doc_id (e.g. 'estv_ks_ks_nr_28', 'sem_weisungen_weisungen-aug-d', 'bsv_weisungen_6930_v20_de', 'seco_alv_avig_ale_de'). Returns full body text, title, date, issuing authority, and PDF URL. Use search_practice first to discover the doc_id.",
            "inputSchema": {
              "properties": {
                "doc_id": {
                  "description": "Document identifier returned by search_practice.",
                  "type": "string"
                }
              },
              "required": [
                "doc_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          }
        ]
      },
      "name": "OpenCaseLaw — Swiss Caselaw, Statutes \u0026 Doctrine",
      "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
      "packages": null,
      "pageJsonUrl": "https://www.anchorterminal.com/tools/opencaselaw-swiss-caselaw.json",
      "popularity": {
        "githubStars": 72
      },
      "registryName": "ch.opencaselaw/swiss-caselaw",
      "remotes": [
        {
          "type": "streamable-http",
          "url": "https://mcp.opencaselaw.ch/mcp"
        },
        {
          "type": "sse",
          "url": "https://mcp.opencaselaw.ch/sse"
        }
      ],
      "repository": "https://github.com/jonashertner/caselaw-repo-1",
      "reviewed": false,
      "slug": "opencaselaw-swiss-caselaw",
      "source": "the official MCP registry",
      "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=ch.opencaselaw/swiss-caselaw",
      "summary": "1M+ Swiss court decisions, statutes \u0026 doctrine with citation graph (DE/FR/IT). CC0, free, 42 tools.",
      "updatedAt": "2026-07-30T23:19:08Z",
      "url": "https://www.anchorterminal.com/tools/opencaselaw-swiss-caselaw",
      "vendor": "opencaselaw.ch",
      "vendorUrl": "https://opencaselaw.ch",
      "version": "1.3.0",
      "websiteUrl": "https://opencaselaw.ch",
      "where": "hosted",
      "why": [
        "vendor"
      ]
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/opencaselaw-swiss-caselaw",
    "json": "https://www.anchorterminal.com/tools/opencaselaw-swiss-caselaw.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/opencaselaw-swiss-caselaw.md",
    "slim": "https://www.anchorterminal.com/tools/opencaselaw-swiss-caselaw.min.md"
  },
  "markdown": "# OpenCaseLaw — Swiss Caselaw, Statutes \u0026 Doctrine\n\n\u003e Indexed, not reviewed: facts from the official MCP registry and our own checks. No score, grade or rank, and not in the rankings until the panel reviews it. How the index works: https://www.anchorterminal.com/indexed/\n\n- Kind: MCP server, by opencaselaw.ch (https://opencaselaw.ch)\n- Listed because: It's published in the registry under opencaselaw.ch, a namespace the registry only gives to whoever proves they control that domain.\n- What the official MCP registry says: 1M+ Swiss court decisions, statutes \u0026 doctrine with citation graph (DE/FR/IT). CC0, free, 42 tools.\n\n## Facts\n\n- MCP registry: `ch.opencaselaw/swiss-caselaw` 1.3.0\n- Endpoint: https://mcp.opencaselaw.ch/mcp (streamable HTTP)\n- Source: https://github.com/jonashertner/caselaw-repo-1\n- Website: https://opencaselaw.ch\n- GitHub stars: 72\n- Registry entry updated: 2026-07-30\n\n## Tools\n\n- Tools it lists (42, about 22,229 tokens of context, `tools/list` without credentials over MCP 2025-11-25, checked 2026-10-04 22:21 UTC):\n  - `search` (read-only): Minimal search tool following the deep-research search/fetch convention. Returns a ranked list of Swiss court decisions matching a query, each as {id, title,…\n  - `fetch` (read-only): Minimal fetch tool following the deep-research search/fetch convention. Fetches one Swiss decision's full text by id, returning {id, title, text, url,…\n  - `search_decisions` (read-only): Use this tool to find COURT DECISIONS (Rechtsprechung): 1,050,000+ Swiss federal and cantonal decisions plus ~2,800 ECtHR decisions concerning Switzerland.…\n  - `get_decision` (read-only): 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…\n  - `get_decisions` (read-only): Use this tool to fetch SEVERAL decisions at once (1-10 ids) instead of calling get_decision repeatedly. Same data per decision — canonical citation strings,…\n  - `list_courts` (read-only): List all available courts with decision counts, date ranges, and language coverage. Use this to discover what data is available.\n  - `get_statistics` (read-only): Get aggregate statistics about the dataset. Optionally filter by court, canton, or year.\n  - `find_citations` (read-only): Given a decision_id, show what it cites and what cites it. Uses the reference graph database with 9.65M citation edges. Returns resolved citations with…\n  - `find_appeal_chain` (read-only): Trace the appeal chain (Instanzenzug) for a decision. Shows prior instances (lower courts) and subsequent instances (appeals to higher courts). Reconstructs…\n  - `find_leading_cases` (read-only): Find the most-cited decisions for a topic or statute. Authority ranking based on citation graph; a free-text topic ranks decisions whose regeste carries the…\n  - `analyze_legal_trend` (read-only): Year-by-year decision counts showing jurisprudence evolution. Use with a statute reference (law_code + article), a text query, or both. Returns yearly counts…\n  - `draft_mock_decision` (read-only): Build a research-only mock decision outline from user facts. Combines relevant Swiss case law retrieval with statute references. If possible, enriches statutes…\n  - `get_case_brief` (read-only): Structured case brief: regeste, Sachverhalt, key Erwägungen (first 12 only — for orientation, NOT a pinpoint ranking), Dispositiv, statutes, citation…\n  - `get_decision_structure` (read-only): Structured decision fields: Sachverhalt (facts), Erwägungen as numbered paragraphs ('1', '1.1', '2.3'), Dispositiv (ruling), Regeste (BGE only). Federal…\n  - `get_erwaegung` (read-only): Verbatim text of ONE numbered Erwägung — the citable unit in Swiss practice (e.g. 'BGE 136 III 513 E. 2.3'). Use when the user already gave an e_number. If…\n  - `find_relevant_erwaegung` (read-only): 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…\n  - `get_article_purpose` (read-only): Return verbatim text from the Federal Council Botschaft (or Erläuterungsbericht) explaining the legislative purpose of a specific article. Joins the verbatim…\n  - `search_botschaft` (read-only): Use this tool to retrieve and quote the VERBATIM text of Federal Council Botschaften (legislative messages). Where get_article_purpose answers 'why does Art. X…\n  - `get_article_history` (read-only): Chronological story of a single statute article: current text + every linked Botschaft (enacted + amendments) + leading court interpretations + doctrinal…\n  - `get_regeste` (read-only): 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,…\n  - `check_claim_support` (read-only): 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…\n  - `attest_response` (read-only): MANDATORY FINAL-STEP AUDIT of your draft answer. Checks five hallucination classes: (1) every case citation (BGE/BGer/BVGer/BStGer/BPatGer/MKGE, FR/IT forms)…\n  - `cite` (read-only): Get the canonical Swiss citation string for a decision reference. CALL THIS BEFORE writing any case citation in your response. Returns ready-to-embed…\n  - `get_doctrine` (read-only): Get statute text + leading cases + doctrinal timeline + Federal Council Botschaft (legislative intent) + scholarly commentary for a Swiss law article or legal…\n  - `generate_exam_question` (read-only): 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…\n  - `get_law` (read-only): AUTHORITATIVE LOOKUP for the text of any Swiss law article — federal OR cantonal — from two local mirrors. Federal (canton='CH', default): Fedlex mirror, all…\n  - `search_laws` (read-only): Use this tool to find STATUTE ARTICLES by topic — full-text over every locally indexed article, federal (Fedlex mirror) AND cantonal (LexFind mirror, all 26…\n  - `get_commentary` (read-only): 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…\n  - `search_commentaries` (read-only): Use this tool ONLY for article-anchored commentary — doctrinal discussion tied to a specific statute article: OnlineKommentar.ch / OpenLegalCommentary.ch…\n  - `search_scholarship` (read-only): Use this tool for open-access SCHOLARSHIP (Lehre): OA journal articles (sui generis et al.), OA legal commentaries (OnlineKommentar, OpenLegalCommentary — this…\n  - `get_scholarship` (read-only): Fetch a single OA legal publication (article, dissertation, commentary, etc.) by its pub_id. Returns full metadata + abstract + full text if available +…\n  - `find_scholarship_citing_statute` (read-only): Find OA legal scholarship that cites a given Swiss statute article. Sourced from article-anchored commentaries (OnlineKommentar / OpenLegalCommentary) PLUS…\n  - `find_scholarship_citing_decision` (read-only): Find OA legal scholarship that cites a specific Swiss court decision. Reverse direction of the scholarship↔caselaw bridge: given a decision_id (e.g.…\n  - `list_scholarship_sources` (read-only): List the open-access legal scholarship sources currently indexed, with publication counts by source, type, and language. Use this to discover what corpora are…\n  - `get_scholarship_full_text` (read-only): Fetch the full text of an OA legal publication by pub_id, on demand. Cached after first fetch so subsequent calls are instant. License-gated: only records…\n  - `get_materialien` (read-only): Look up Materialien for a Swiss federal law article. Returns up to three things: `sources` = per-article digests of legislative intent (BV and BGFA only — 167…\n  - `search_materialien` (read-only): Use this tool for DIGESTED legislative history — per-article intent summaries and key arguments, not verbatim text. COVERAGE IS NARROW: BV and BGFA digests…\n  - `search_legislation` (read-only): Use this tool to find WHOLE LAWS by name or subject — 33,000+ federal and cantonal enactments from LexFind.ch; the entry point for cantonal questions…\n  - `get_legislation` (read-only): 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…\n  - `browse_legislation_changes` (read-only): Browse recent legislation changes for a canton or federal level. Shows new laws, amendments, and abrogations with dates.\n  - `search_practice` (read-only): Use this tool when the question involves federal ADMINISTRATIVE PRACTICE (Verwaltungspraxis): Wegleitungen, Kreisschreiben, Weisungen, Rundschreiben — agency…\n  - `get_practice` (read-only): Retrieve a single federal administrative-practice document by its doc_id (e.g. 'estv_ks_ks_nr_28', 'sem_weisungen_weisungen-aug-d',…\n- How its tools read to an agent (0 errors, 7 warnings, 2 notes, about 22,229 tokens; rules at https://www.anchorterminal.com/check.md; not part of the score):\n  - warn TC11 get_article_history: 1 parameter without a description: language\n  - warn TC14 get_legislation: allowed values are in the description, not an enum: systematic_number\n  - warn TC22 cite: the definition is about 2,056 tokens\n  - warn TC22 get_decision: the definition is about 1,505 tokens\n  - warn TC22 get_law: the definition is about 1,966 tokens\n  - warn TC22 search_decisions: the definition is about 2,655 tokens\n  - warn TC23 server: 42 tools, about 22,255 tokens of definitions\n  - note TC24 server: 32 of 42 tools have no outputSchema\n  - note TC29 server: about 1,312 tokens (5% of the definitions) are titles that repeat property or function names\n\n- JSON: https://www.anchorterminal.com/api/v1/tools/opencaselaw-swiss-caselaw.json\n- Being indexed says nothing about quality, and nobody can pay for it. Ask for a review: https://www.anchorterminal.com/builders/#claiming\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-04",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Indexed",
        "url": "https://www.anchorterminal.com/indexed/"
      },
      {
        "name": "OpenCaseLaw — Swiss Caselaw, Statutes \u0026 Doctrine",
        "url": ""
      }
    ],
    "description": "OpenCaseLaw — Swiss Caselaw, Statutes \u0026 Doctrine, an MCP server by opencaselaw.ch, listed from the official MCP registry. Indexed, not reviewed: facts and our own checks, no score or ranking. 1M+ Swiss court decisions, statutes \u0026 doctrine with citation graph (DE/FR/IT). CC0…",
    "facts": [
      "not reviewed",
      "not ranked",
      "facts only"
    ],
    "h1": "OpenCaseLaw — Swiss Caselaw, Statutes \u0026 Doctrine",
    "image": "https://www.anchorterminal.com/assets/og/indexed.png",
    "path": "/tools/opencaselaw-swiss-caselaw",
    "published": "",
    "section": "indexed",
    "title": "OpenCaseLaw — Swiss Caselaw, Statutes \u0026 Doctrine | Anchor Terminal",
    "toc": null,
    "updated": "2026-10-04",
    "url": "https://www.anchorterminal.com/tools/opencaselaw-swiss-caselaw"
  },
  "tokens": {
    "markdown": 2700,
    "slim": 2630
  },
  "version": 1
}
