{
  "markdown": "# entscheidsuche-mcp\n\n**MCP-Server für die offene Schweizer Rechtsprechung** (Beta) —\nVolltextsuche und Volltextzugriff auf publizierte Gerichtsentscheide\naller Schweizer Instanzen (Bundesgerichte, kantonale Gerichte,\nVerwaltungsbehörden, Strafbefehle) in Deutsch, Französisch und\nItalienisch — über das [Model Context Protocol](https://modelcontextprotocol.io).\n\n> **MCP Server for Swiss case law (beta).** Search and retrieve published\n> court decisions from all Swiss instances (federal courts, all 26 cantons,\n> administrative authorities, penal orders) in German, French, and Italian.\n> Operated as open Swiss legal data infrastructure by the non-profit\n> association [entscheidsuche.ch](https://entscheidsuche.ch), tax-exempt\n> in Switzerland since 2020.\n\n**Öffentlicher Endpunkt:** `https://mcp.entscheidsuche.ch/mcp`\n(Streamable HTTP, ohne Authentifizierung)\n\n**Landing Page für Endnutzer:** [mcp.entscheidsuche.ch](https://mcp.entscheidsuche.ch) —\ndort steht alles Nötige zur Einrichtung in Claude.ai, ChatGPT, Cursor,\nVS Code, Claude Desktop und anderen Clients. Dieses Repository richtet\nsich primär an Entwickler, Drittanwendungen und Selbst-Betreiber.\n\n[![Lizenz Code](https://img.shields.io/badge/code-MIT-blue.svg)](#lizenz)\n[![Daten](https://img.shields.io/badge/data-open-green.svg)](https://entscheidsuche.ch)\n[![Status](https://img.shields.io/badge/status-beta-yellow.svg)](https://mcp.entscheidsuche.ch)\n[![Betrieb](https://img.shields.io/badge/operator-Verein%20entscheidsuche.ch-orange.svg)](https://entscheidsuche.ch)\n\n---\n\n## Inhalt\n\n- [Über den MCP-Server](#über-den-mcp-server)\n- [Tools](#tools)\n- [Suchsyntax](#suchsyntax--cheatsheet)\n- [Schnelleinbindung in MCP-Clients](#schnelleinbindung-in-mcp-clients)\n- [Lokale Entwicklung](#lokale-entwicklung)\n- [Eigene Instanz deployen](#eigene-instanz-deployen-debian)\n- [Architektur](#architektur)\n- [Trägerverein](#trägerverein)\n- [Beitragen](#beitragen)\n- [Lizenz](#lizenz)\n\n## Über den MCP-Server\n\nSchweizer Gerichtsentscheide sind formal öffentlich, faktisch aber über\nmehr als 26 kantonale Portale, mehrere Bundesgerichte und unterschiedlich\nstrukturierte Veröffentlichungsformate verteilt. Der **Verein\nentscheidsuche.ch** sammelt diese Entscheide seit 2017 ein, indexiert\nsie volltextlich und macht sie zugänglich. Eine Lizenz gibt es nicht, da\nGerichtsentscheide nicht dem Urheberrecht unterstehen. Dieser\nMCP-Server bringt diesen Bestand zu KI-Assistenten und programmatischen\nClients.\n\n**Was den Server unterscheidet**\n\n- Betrieben vom **gemeinnützigen Verein entscheidsuche.ch** (gegründet\n  2017 in Landquart GR, seit 2020 in Bern als gemeinnütziger Zweck\n  steuerbefreit) — kollektiv getragene Schweizer Rechtsdaten-Infrastruktur,\n  kein Bastelprojekt\n- **Eigener Datenbestand**: tägliche Scrapes direkt aus den\n  Originalquellen aller Schweizer Gerichte. Enthält auch Entscheide,\n  die von Behörden nicht oder nicht in geeigneter Form publiziert\n  werden und über die Upload-Funktion (seit 2021) eingereicht wurden,\n  darunter Strafbefehle\n- **Drei Amtssprachen** (DE / FR / IT) mit gezieltem Sprachfilter und\n  sprachübergreifender Suche\n- **Offen** — keine Authentifizierung, kein API-Key, lizenzfrei\n\n## Tools\n\n| Tool | Zweck |\n| --- | --- |\n| `search` | Volltextsuche mit Lucene-Syntax. Filter nach Entscheiddatum, Scrape-Datum, Hierarchie (Kanton / Gericht / Kammer) und Sprache. Sortierung nach Relevanz, Entscheiddatum oder Scrape-Datum. Paginierung über `next_cursor` / `search_after`. Aggregationen für Facetten-Auswertung. |\n| `search_by_case_number` | Exakte Phrasensuche nach Geschäftsnummern, Aktenzeichen und BGE-Zitaten (z.B. `BGE 142 III 1`, `6B_1234/2025`, `5A_396/2015`). Setzt die Nummer automatisch in Anführungszeichen. |\n| `fetch_document` | Vollständigen Entscheid samt Volltext anhand der ID abrufen. |\n| `list_hierarchy` | Hierarchie-IDs (Bund / Kanton / Gericht / Kammer) mit Trefferzahlen. |\n| `list_facets` | Hierarchischer Facetten-Baum mit lokalisierten Labels in DE/FR/IT. |\n| `server_info` | Versions- und Konfigurationsinformationen. |\n\nVollständige Schnittstellenbeschreibung mit allen Parametern, Filtern,\nRückgabe-Schemata und Beispielen: [docs/API.md](docs/API.md).\n\n## Suchsyntax — Cheatsheet\n\n| Aufgabe | Beispiel |\n| --- | --- |\n| Volltext, alle Begriffe (AND) | `Mietzins Kündigung` |\n| Phrase, exakte Reihenfolge | `\"fristlose Kündigung\"` |\n| Geschäftsnummer | `\"BGE 142 III 1\"` |\n| OR | `Mietzins OR Pachtzins` |\n| Negation | `Mietzins NOT Erhöhung` |\n| Wildcard | `Mietz*` |\n| Feld-Suche | `title.de:\"Kündigung\"` |\n\nStandardverknüpfung zwischen Wörtern ist `AND`. Gesucht wird in\n`title`, `abstract`, `meta`, `attachment.content` und `reference`.\n\n`language` und `sort` sind optional. Ohne `language` erfolgt **keine**\nSpracheinschränkung — der Server liefert das erste vorhandene\nSprachfeld zurück (de → fr → it). Ohne `sort` wird nach Relevanz\nsortiert. Zur expliziten Sprachfilterung dient `language_filter`.\nErlaubte Sprachen: `de`, `fr`, `it`.\n\n## Schnelleinbindung in MCP-Clients\n\nAusführliche, client-spezifische Anleitungen mit Voraussetzungen\n(Tarif-Anforderungen für claude.ai und ChatGPT, Konfigurations-Pfade)\nstehen auf der [Landing Page](https://mcp.entscheidsuche.ch) und in\n[docs/CLIENTS.md](docs/CLIENTS.md). Im Wesentlichen:\n\n**Claude Code (CLI)**\n\n```bash\nclaude mcp add --transport http entscheidsuche https://mcp.entscheidsuche.ch/mcp\n```\n\n**Cursor / Windsurf / VS Code / Generisch (`mcp.json`)**\n\n```json\n{\n  \"mcpServers\": {\n    \"entscheidsuche\": {\n      \"url\": \"https://mcp.entscheidsuche.ch/mcp\"\n    }\n  }\n}\n```\n\n**Claude Desktop** (stdio-only, daher über die `mcp-remote`-Bridge):\n\n```json\n{\n  \"mcpServers\": {\n    \"entscheidsuche\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-remote\", \"https://mcp.entscheidsuche.ch/mcp\"]\n    }\n  }\n}\n```\n\n**MCP Inspector zum Testen**\n\n```bash\nnpx @modelcontextprotocol/inspector https://mcp.entscheidsuche.ch/mcp\n```\n\n> Hinweis: Nicht jede Client-Anleitung ist vollständig durchgespielt;\n> Tarife, Tool-Listen und Konfigurations-Pfade ändern sich bei Anthropic,\n> OpenAI und anderen Anbietern regelmässig. Bei Abweichungen gilt die\n> offizielle Doku des jeweiligen Clients — Rückmeldungen bitte als\n> Issue oder PR.\n\n## Lokale Entwicklung\n\n```bash\ngit clone https://github.com/entscheidsuche/entscheidsuche-mcp.git\ncd entscheidsuche-mcp\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -e '.[dev]'\n\n# Server starten — Streamable HTTP auf 127.0.0.1:8765/mcp\npython -m entscheidsuche_mcp\n\n# Alternative: stdio (für lokale CLI-Clients)\npython -m entscheidsuche_mcp --transport stdio\n```\n\n### Konfiguration (Umgebungsvariablen)\n\nVollständige Liste in [`.env.example`](.env.example). Die wichtigsten:\n\n| Variable | Default | Bedeutung |\n| --- | --- | --- |\n| `ENTSCHEIDSUCHE_ES_URL` | `https://entscheidsuche.pansoft.de:9200/entscheidsuche.v2-*/_search` | Elasticsearch-Endpoint |\n| `ENTSCHEIDSUCHE_FACETS_URL` | `https://www.recherche.histoirerurale.ch/Facetten.json` | Facetten-Hierarchie |\n| `HOST` / `PORT` | `127.0.0.1` / `8765` | Listen-Adresse |\n| `MCP_PATH` | `/mcp` | HTTP-Pfad |\n| `MCP_STATELESS_HTTP` | `true` | Streamable HTTP ohne Session-Pflicht |\n| `MCP_DNS_REBINDING_PROTECTION` | `true` | Host-/Origin-Prüfung |\n| `PUBLIC_BASE_URL` | `https://mcp.entscheidsuche.ch` | Öffentliche Basis-URL |\n| `LOG_LEVEL` | `INFO` | Loglevel |\n\n### Schnelltest mit `curl`\n\n```bash\n# initialize\ncurl -N -H 'Content-Type: application/json' \\\n     -H 'Accept: application/json, text/event-stream' \\\n     http://localhost:8765/mcp \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-06-18\",\"capabilities\":{},\"clientInfo\":{\"name\":\"curl\",\"version\":\"0\"}}}'\n\n# tools/list\ncurl -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \\\n     http://localhost:8765/mcp \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\"}'\n\n# search\ncurl -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \\\n     http://localhost:8765/mcp \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":3,\"method\":\"tools/call\",\"params\":{\"name\":\"search\",\"arguments\":{\"query\":\"\\\"BGE 142 III 1\\\"\",\"language\":\"de\",\"size\":3}}}'\n```\n\nKomfortabler ist ein echter MCP-Client (MCP Inspector, Claude Code) —\nder übernimmt die Streamable-HTTP-Session-Verwaltung automatisch.\n\n## Eigene Instanz deployen (Debian)\n\nDas Repository enthält eine systemd-Unit, einen nginx-vHost und ein\nInstallations-Script. Damit kann jeder einen eigenen MCP-Endpoint\ngegen den gleichen Elasticsearch-Index betreiben.\n\n```bash\nssh root@your-server.example\ngit clone https://github.com/entscheidsuche/entscheidsuche-mcp.git /opt/entscheidsuche-mcp\nsudo bash /opt/entscheidsuche-mcp/deploy/install.sh\n\n# TLS-Zertifikat\nsudo apt-get install -y certbot python3-certbot-nginx\nsudo certbot --nginx -d mcp.example.org\n```\n\nDas Script legt den Systemnutzer `entscheidsuche` an, baut ein venv,\nkopiert `.env.example` nach `/etc/entscheidsuche-mcp.env`, installiert\ndie systemd-Unit und den nginx-vHost.\n\nStatus prüfen:\n\n```bash\nsystemctl status entscheidsuche-mcp\njournalctl -u entscheidsuche-mcp -f\n```\n\n## Nutzungsstatistik (`/statistik`)\n\nDer MCP-Server liefert unter `/statistik` eine selbst-enthaltene\nHTML-Seite mit Tageszahlen, Top-Tools, KI-Client-Klassifizierung\n(`clientInfo.name`), Stunden-Sparklines und Methoden-Verteilung.\nWird **bei jedem Aufruf live** generiert; Vortage werden in einem\nJSON-Cache (`/var/lib/entscheidsuche-mcp/stats-cache.json`) fixiert.\n\nBasic Auth via Env-Variablen (in `/etc/entscheidsuche-mcp.env`):\n\n```bash\nESC_STATS_USER=admin\nESC_STATS_PASS=DEIN_PASSWORT\n```\n\nSind beide leer, ist `/statistik` ungeschützt zugänglich (Dev-Modus).\nDer Authorization-Header wird vom nginx-vHost unverändert an den\nPython-Server durchgereicht; die Prüfung passiert dort per\n`hmac.compare_digest` gegen die Env-Variablen.\n\nInhalte sind reine Aggregate. Mit `ESC_ACCESS_LOG_ARGS_MAX=0` (Default\nim `.env.example`) werden Tool-Argumente — also die Suchqueries der\nNutzer — gar nicht erst geloggt.\n\nDatenquelle: `/var/log/entscheidsuche-mcp/access.log` (geschrieben von\nder `entscheidsuche_mcp.access`-Middleware). Logrotation z. B. via\n`/etc/logrotate.d/entscheidsuche-mcp` einrichten:\n\n```\n/var/log/entscheidsuche-mcp/access.log {\n    weekly\n    rotate 12\n    compress\n    delaycompress\n    missingok\n    notifempty\n    copytruncate\n}\n```\n\n`copytruncate` ist wichtig, damit der Logger weiter in die rotierte\nDatei schreibt, ohne dass der Server neu gestartet werden muss.\n\n## Architektur\n\n```\nMCP-Client (Claude, ChatGPT, Cursor, ...)\n       │  Streamable HTTP (JSON-RPC)\n       ▼\nmcp.entscheidsuche.ch\n       │  TLS, nginx Reverse Proxy\n       ▼\n127.0.0.1:8765/mcp  ← uvicorn + FastMCP\n       │  HTTPS\n       ▼\nElasticsearch (entscheidsuche.v2-*)\n```\n\nImplementierung: Python + [FastMCP](https://github.com/jlowin/fastmcp).\n\n## Trägerverein\n\nDer MCP-Server, die zugrundeliegende Plattform und der Datenbestand\nwerden vom **Verein entscheidsuche.ch** betrieben.\n\n- **Gegründet:** 2017 in Landquart (GR)\n- **Vereinszweck:** Die Rechtsprechung schweizerischer Gerichte für\n  jedermann durchsuchbar und zugreifbar machen\n  ([Statuten](https://entscheidsuche.ch))\n- **Gemeinnützigkeit:** Seit 2020 vom Kanton Bern wegen Verfolgung\n  gemeinnütziger Zwecke von der Steuerpflicht befreit\n- **Vorstand:** Jörn Erbguth, Daniel Kettiger, Claudia Schreiber\n- **Kontakt:** `info@entscheidsuche.ch`\n- **Postadresse:** Verein entscheidsuche.ch, 3000 Bern\n- **Spendenkonto:** Postfinance IBAN `CH04 0900 0000 1412 0685 4`,\n  Verein entscheidsuche.ch, 8000 Zürich (Spendenquittung auf Anfrage)\n- **Mitgliedschaft:** 100 CHF/Jahr für natürliche Personen,\n  1'000 CHF/Jahr für institutionelle Mitglieder\n\nDie Plattform wurde 2018–2020 durch eine\n[Crowdfunding-Aktion auf wemakeit](https://wemakeit.com/projects/entscheidsuche-ch)\nfinanziert. Eine kurze Vorstellung des Projekts erschien im Juli 2021\nin der Zeitschrift für Zivilprozess- und Zwangsvollstreckungsrecht (ZZZ).\n\nDie Scraper, mit denen die Entscheide aus den Originalquellen geholt\nwerden, sind ebenfalls open source — siehe Repositories des Vereins\nauf GitHub.\n\n## Beitragen\n\nIssues, Pull Requests und Vorschläge sind willkommen, insbesondere:\n\n- Fehlerberichte zur Suche oder zur API\n- Erweiterungen der MCP-Tools (z.B. Aggregations-/Statistik-Tools,\n  Zitationsgraph)\n- Verbesserungen der Client-Anleitungen in [docs/CLIENTS.md](docs/CLIENTS.md)\n- Übersetzungen\n\nBei **Datenfehlern** oder fehlenden Entscheiden bitte direkt an\n`info@entscheidsuche.ch` — der Datenbestand wird zentral gepflegt,\nnicht in diesem Repo.\n\n## Lizenz\n\n**Code:** [MIT](LICENSE)\n\n**Daten:** Die zugrundeliegenden Gerichtsentscheide sind amtliche Werke\nund stehen gemäss URG Art. 5 nicht unter Urheberrechtsschutz. Die\nstrukturierten Aufbereitungen des Vereins entscheidsuche.ch sind\nfrei nutzbar — Details unter [entscheidsuche.ch](https://entscheidsuche.ch).\n",
  "bytes": 12911,
  "sha": "c49b0255ee03283b44b9206588cab0958ff77d76563a06883a0a25b207119cf1",
  "repo_slug": "entscheidsuche/entscheidsuche-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_ch_entscheidsuche_mcp_440c9ca8/readme"
}