Model Context Protocol

entscheidsuche-mcp

MCP-Server (beta-Version) für entscheidsuche.ch. Diese Instanz stellt die Suche in Schweizer Gerichtsentscheiden, Gerichtsurteilen und Rechtsprechung über einen MCP-Endpunkt bereit: Bundesgerichte und kantonale Gerichte, Verwaltungsbehörden und auch Strafbefehle.

MCP-Endpunkt
https://mcp.entscheidsuche.ch/mcp
Verfügbare Tools
Methoden im Detail

Ein- und Ausgabeparameter jeder Methode. Alle Parameter mit einem Default sind optional; nur die mit Pflicht gekennzeichneten müssen angegeben werden. Die Beispiele sind echte, gekürzte Antworten dieses Servers.

search Volltextsuche

Volltextsuche über alle Entscheide. query versteht Lucene-Syntax: "…" für Phrasen, AND/OR/NOT, Wildcards * und ?. Default-Operator zwischen Begriffen ist AND; Filter werden mit AND verknüpft.

Eingabe

ParameterTypDefaultBeschreibung
querystring"*"Volltext-Anfrage. "*" matcht alles.
language"de"|"fr"|"it"nullBevorzugte Sprache für Titel/Highlight. Kein Filter — dafür language_filter.
sort"relevance"|"date"|"scrapedate""relevance"Sortierung; date = Entscheiddatum.
sizeinteger 1–10020Treffer pro Seite.
search_afterarraynullCursor: next_cursor der vorigen Antwort.
decision_date_fromdatenullUntergrenze Entscheiddatum (YYYY-MM-DD, inklusive).
decision_date_todatenullObergrenze Entscheiddatum (YYYY-MM-DD, inklusive).
scrape_date_fromdatenullUntergrenze Scrape-Datum.
scrape_date_todatenullObergrenze Scrape-Datum.
hierarchystring[]nullHierarchie-IDs (Kanton/Gericht/Kammer) aus list_hierarchy. Mehrere werden mit OR verknüpft.
language_filter("de"|"fr"|"it")[]nullEchter Filter nach Dokumentsprache(n).
include_aggregationsbooleanfalseAggregationen (Verteilungen) mitliefern.

Ausgabe

FeldTypBeschreibung
totalintegerGesamtzahl der Treffer (nicht nur dieser Seite).
hitsTreffer[]Die Treffer dieser Seite — Felder siehe „Treffer-Objekt“ unten.
next_cursorarray|nullAls search_after im nächsten Request mitgeben. null = keine weiteren Treffer.
aggregationsobject|nullNur bei include_aggregations: true; je Feld eine Liste von {key, count}.

Beispiel

// Aufruf
{ "query": "Mietrecht Kündigung", "sort": "date", "size": 3 }

// Antwort (gekürzt)
{
  "total": 886,
  "hits": [
    {
      "id": "ZH_BK_004_MJ240016-L_2026-04-22",
      "title": "Zürich Bezirksgerichte Mietgericht 22.04.2026 MJ240016-L",
      "abstract": "ZMP 2026 Nr. 6: Mietzinserhöhungen …",
      "text": "Eine <em>Kündigung</em> kann auf jedes Monatsende …",
      "meta": "Zürich Bezirksgerichte Mietgericht",
      "canton": "ZH",
      "court": "ZH_BK",
      "decision_date": "2026-04-22",
      "scrape_date": "2026-05-03",
      "is_pdf": true,
      "document_url": "https://entscheidsuche.ch/docs/ZH_Obergericht/ZH_BK_004_MJ240016-L_2026-04-22.pdf",
      "original_url": null,
      "sort": [1776816000000, "ZH_BK_004_MJ240016-L_2026-04-22"]
    }
  ],
  "next_cursor": [1772668800000, "ZH_BK_004_MJ240004-L_2026-03-05"],
  "aggregations": null
}
search_by_case_number Geschäftsnummer / BGE-Zitat

Setzt case_number automatisch in Anführungszeichen und sucht als exakte Phrase. Ansonsten identisch zu search — gleiche Filter, gleiche Antwortstruktur.

Eingabe

ParameterTypDefaultBeschreibung
case_numberstringPflichtGeschäftsnummer, Aktenzeichen, Urteilsnummer oder BGE-Zitat, z. B. BGE 142 III 1 oder 5A_396/2015.
language"de"|"fr"|"it"nullBevorzugte Sprache für Titel/Highlight (kein Filter).
sort"relevance"|"date"|"scrapedate""relevance"Sortierung.
sizeinteger 1–10020Treffer pro Seite.
search_afterarraynullPaginierungs-Cursor.
decision_date_from / decision_date_todatenullZeitraum Entscheiddatum (YYYY-MM-DD).
scrape_date_from / scrape_date_todatenullZeitraum Scrape-Datum.
hierarchystring[]nullHierarchie-IDs für Kanton/Gericht/Kammer.
language_filter("de"|"fr"|"it")[]nullFilter nach Dokumentsprache(n).
include_aggregationsbooleanfalseAggregationen mitliefern.

Ausgabe

Identisch zu search: total, hits, next_cursor, aggregations.

Beispiel

// Aufruf
{ "case_number": "BGE 142 III 1", "size": 1 }

// Antwort (gekürzt)
{
  "total": 171,
  "hits": [
    {
      "id": "CH_BGE_005_BGE-142-III-1_2016",
      "title": "Bundesgericht (BGE) Teil III 2016 BGE 142 III 1",
      "abstract": "Regeste a … Art. 85 Abs. 1 IPRG; Art. 5 HKsÜ …",
      "canton": "CH",
      "court": "CH_BGE",
      "decision_date": "2016-01-01",
      "is_pdf": false,
      "document_url": "https://entscheidsuche.ch/docs/CH_BGE/CH_BGE_005_BGE-142-III-1_2016.html",
      "sort": [50.027256, "CH_BGE_005_BGE-142-III-1_2016"]
    }
  ],
  "next_cursor": [50.027256, "CH_BGE_005_BGE-142-III-1_2016"]
}
fetch_document Einzelentscheid inkl. Volltext

Liefert einen einzelnen Entscheid anhand seiner Dokument-ID — im Unterschied zur Suche mit dem vollständigen Volltext in text (nicht nur einem Highlight-Auszug).

Eingabe

ParameterTypDefaultBeschreibung
idstringPflichtDokument-ID aus einem Suchtreffer, z. B. CH_BGE_005_BGE-142-III-1_2016.
language"de"|"fr"|"it"nullBevorzugte Sprache für Titel/Abstract. Ohne Angabe das erste vorhandene Sprachfeld.

Ausgabe

FeldTypBeschreibung
resultTreffer|nullDas Treffer-Objekt (Felder siehe unten) mit vollständigem text. null, wenn die ID nicht existiert. sort ist hier immer null.

Beispiel

// Aufruf
{ "id": "CH_BGE_005_BGE-142-III-1_2016" }

// Antwort (gekürzt)
{
  "result": {
    "id": "CH_BGE_005_BGE-142-III-1_2016",
    "title": "Bundesgericht (BGE) Teil III 2016 BGE 142 III 1",
    "abstract": "Regeste a … Zuteilung der alleinigen elterlichen Sorge …",
    "text": "Urteilskopf\n\n142 III 1\n\n1. Auszug aus dem Urteil der II. zivilrechtlichen Abteilung …",
    "meta": "Eidgenossenschaft Bundesgericht (BGE) Teil III",
    "canton": "CH",
    "court": "CH_BGE",
    "decision_date": "2016-01-01",
    "scrape_date": "2023-01-01",
    "is_pdf": false,
    "document_url": "https://entscheidsuche.ch/docs/CH_BGE/CH_BGE_005_BGE-142-III-1_2016.html",
    "original_url": null,
    "sort": null
  }
}
list_hierarchy Hierarchie-IDs mit Trefferzahlen

Liefert die Hierarchie-IDs für Kantone, Gerichte und Kammern mit Trefferzahlen. Die IDs werden im hierarchy-Filter von search verwendet. Mit query beziehen sich die Zahlen auf die Treffer dieser Anfrage.

Eingabe

ParameterTypDefaultBeschreibung
querystring"*"Optionale Volltext-Anfrage zur Eingrenzung der Aggregation.
sizeinteger 1–100001000Maximale Anzahl Einträge.

Ausgabe

FeldTypBeschreibung
entriesarrayListe von { id, count }, absteigend nach count.
entries[].idstringHierarchie-ID, z. B. CH_BGer, ZH.
entries[].countintegerAnzahl Dokumente unter dieser ID.

Beispiel

// Aufruf
{ "query": "Mietrecht", "size": 4 }

// Antwort
{
  "entries": [
    { "id": "CH",          "count": 736 },
    { "id": "CH_BGer",     "count": 503 },
    { "id": "ZH",          "count": 485 },
    { "id": "CH_BGer_004", "count": 444 }
  ]
}
list_facets Facettenbaum, lokalisiert

Hierarchischer Facettenbaum mit lokalisierten Bezeichnungen. Anders als list_hierarchy ohne Trefferzahlen, dafür mit Klartext-Namen in mehreren Sprachen. Die id-Werte sind im hierarchy-Filter verwendbar.

Eingabe

Keine Parameter.

Ausgabe

FeldTypBeschreibung
idstringHierarchie-ID (im hierarchy-Filter verwendbar).
labelobjectBezeichnungen je Sprache: de, fr, it, en (einzelne können null sein).
childrenarrayUntergeordnete Knoten gleicher Struktur (rekursiv).

Beispiel

// Aufruf
{}

// Antwort (Auszug — ein Knoten je Listeneintrag)
{
  "id": "CH",
  "label": {
    "de": "Eidgenossenschaft",
    "fr": "Conféderation",
    "it": "Confederazione",
    "en": null
  },
  "children": []
}
{
  "id": "AG",
  "label": { "de": "Aargau", "fr": "Argovie", "it": "Argovia", "en": null },
  "children": []
}
server_info Version und Endpunkte

Diagnose-Endpunkt: Version des Servers und die konfigurierten Upstream-URLs. Nützlich, um zu prüfen, welche Version tatsächlich läuft.

Eingabe

Keine Parameter.

Ausgabe

FeldTypBeschreibung
namestringServername.
versionstringVersion des laufenden Servers.
elasticsearch_urlstringAngebundener Suchindex.
facets_urlstringQuelle des Facettenbaums.
languagesstring[]Unterstützte Sprachen.
sort_ordersstring[]Zulässige Werte für sort.

Beispiel

// Aufruf
{}

// Antwort
{
  "name": "entscheidsuche-mcp",
  "version": "0.1.1",
  "elasticsearch_url": "https://entscheidsuche.pansoft.de:9200/entscheidsuche.v2-*/_search",
  "facets_url": "https://entscheidsuche.ch/docs/Facetten.json",
  "languages": ["de", "fr", "it"],
  "sort_orders": ["relevance", "date", "scrapedate"]
}
Treffer-Objekt gemeinsame Felder

Diese Struktur liefern search und search_by_case_number in hits[] sowie fetch_document in result.

FeldTypBeschreibung
idstringDokument-ID — für fetch_document verwendbar.
titlestringTitel des Entscheids.
abstractstringRegeste bzw. Kurzfassung, sofern vorhanden.
textstringBei der Suche ein Highlight-Auszug (Fundstellen in <em>), bei fetch_document der vollständige Volltext.
metastringKlartext-Bezeichnung des Gerichts.
cantonstringKantonskürzel, CH für Bundesbehörden.
courtstringGerichts-ID (aus der Dokument-ID abgeleitet).
decision_datestring|nullEntscheiddatum, ISO YYYY-MM-DD.
scrape_datestring|nullDatum der Erfassung, ISO YYYY-MM-DD.
is_pdfbooleanOb das Originaldokument ein PDF ist.
document_urlstring|nullDirektlink auf das Originaldokument.
original_urlstring|nullURL der ursprünglichen Quell-Webseite.
sortarray|nullSortierwerte des Treffers (Basis für search_after).
Typische Anwendungsfälle
Einbindung in Clients

Der Server arbeitet ohne Authentifizierung. Was Sie brauchen, ist ein Client, der das Model Context Protocol über Streamable HTTP spricht. Was Sie an Subscription brauchen, hängt vom Client ab — die folgenden Abschnitte fassen das pro Client zusammen.

Hinweis: Nicht jede der folgenden Anleitungen ist praktisch durchgespielt; einige beruhen auf den offiziellen Dokumentationen der jeweiligen Anbieter. MCP ist ein junges Protokoll. Tool-Listen, Tarife und Konfigurations-Pfade ändern sich bei Anthropic, OpenAI und anderen regelmässig und manchmal kurzfristig. Bei Abweichungen zur offiziellen Doku des Clients gilt dessen Doku — und gerne eine kurze Rückmeldung an uns, wenn etwas nicht mehr passt.

Claude.ai (Web, Mobile, Desktop) Pro / Max / Team / Enterprise
  1. claude.ai → Settings → Connectors (in einigen Tarifen Integrations).
  2. „Add custom connector" wählen.
  3. Eintragen:
    • Name: entscheidsuche
    • Remote MCP server URL: https://mcp.entscheidsuche.ch/mcp
    • Authentication: None
    • Transport: Streamable HTTP (nicht SSE — SSE ist nur Legacy-Fallback).
  4. Connector pro Chat aktivieren (Tool-Symbol unter dem Eingabefeld).

In Free-Konten sind Custom-Connectors nicht verfügbar. Team- und Enterprise-Workspaces können verlangen, dass der Workspace-Admin den Connector zentral freischaltet. Doku: support.claude.com.

Claude Desktop App gratis · benötigt Node.js

Claude Desktop spricht stdio. Über die Bridge mcp-remote klappt der HTTP-Server trotzdem:

{
  "mcpServers": {
    "entscheidsuche": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.entscheidsuche.ch/mcp"]
    }
  }
}

Pfad der Konfigurationsdatei:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Anschliessend Claude Desktop einmal komplett beenden und neu starten.

Claude Code (CLI) API-Credits oder Pro/Max
claude mcp add --transport http entscheidsuche https://mcp.entscheidsuche.ch/mcp

Status prüfen mit claude mcp list, entfernen mit claude mcp remove entscheidsuche. Doku: docs.claude.com.

Claude API (eigener Code) Anthropic-API-Konto
import anthropic

client = anthropic.Anthropic()
resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    mcp_servers=[
        {
            "type": "url",
            "url": "https://mcp.entscheidsuche.ch/mcp",
            "name": "entscheidsuche",
        }
    ],
    messages=[{"role": "user", "content": "Suche BGE 142 III 1."}],
    extra_headers={"anthropic-beta": "mcp-client-2025-04-04"},
)

Doku: docs.claude.com.

ChatGPT Pro / Team / Enterprise / Edu
  1. chatgpt.com → Settings → Connectors„Create".
  2. MCP Server URL: https://mcp.entscheidsuche.ch/mcp, Auth = No authentication.
  3. Falls ein Transport-Feld erscheint: Streamable HTTP wählen (nicht SSE).
  4. Connector im Chat aktivieren (Tools-Menü) bzw. in einem Deep-Research-Run anhaken.

Hinweis: OpenAIs Deep-Research-Modus sucht nach Tools mit den Namen search und fetch. Unser Server hat search; fetch_document wird im normalen Connector-Modus mitgenutzt, im strikten Deep-Research-Modus eventuell nicht automatisch erkannt. Doku: platform.openai.com.

Perplexity Pro / Enterprise · Verfügbarkeit ändert sich
  1. perplexity.ai → Settings → Connectors (bzw. „Integrations"; im Enterprise-Workspace unter „Workspace settings").
  2. „Add custom connector" / „Add MCP server" wählen.
  3. Eintragen:
    • Name: entscheidsuche
    • Server URL: https://mcp.entscheidsuche.ch/mcp
    • Authentication: None
  4. Connector im Chat über das Tools-/Connectors-Symbol aktivieren.

Custom-MCP-Connectors sind in den kostenpflichtigen Tarifen vorgesehen, typischerweise Perplexity Pro, Enterprise oder Business. Verfügbarkeit und UI-Pfade ändern sich bei Perplexity öfter als bei anderen Anbietern; dieser Eintrag wurde nicht selbst durchgespielt. Doku: perplexity.ai/help-center.

VS Code mit GitHub Copilot Copilot Pro o.ä.

Workspace-lokal in .vscode/mcp.json:

{
  "servers": {
    "entscheidsuche": {
      "type": "http",
      "url": "https://mcp.entscheidsuche.ch/mcp"
    }
  }
}

Im Chat „Agent"-Modus wählen, Werkzeug-Symbol klicken, Tools aktivieren. Doku: code.visualstudio.com.

Cursor gratis möglich

UI: Settings → MCP → Add new MCP server. Oder in ~/.cursor/mcp.json:

{
  "mcpServers": {
    "entscheidsuche": {
      "url": "https://mcp.entscheidsuche.ch/mcp"
    }
  }
}
Weitere Open-Source-Clients gratis

Cline, Continue.dev, Zed, 5ire, goose, LibreChat, Open WebUI, LobeChat — jeweils ein Custom MCP server-Eintrag mit der URL https://mcp.entscheidsuche.ch/mcp. Was bei diesen Tools kostet, ist nur das jeweils gewählte Sprachmodell.

MCP Inspector (zum Testen) gratis · Node 18+
npx @modelcontextprotocol/inspector

Im Browser-UI: Transport HTTP / Streamable HTTP, URL https://mcp.entscheidsuche.ch/mcp, Auth leer. Ideal zum Ausprobieren, ohne irgendein Konto.

Eine ausführlichere Anleitung mit allen Voraussetzungen finden Sie in docs/CLIENTS.md im Repository.

Hinweis

Die eigentliche MCP-Schnittstelle liegt unter /mcp. Auf dieser Startseite finden Sie nur die kurze Dokumentation und den Einstieg für MCP-Clients.

Zum Repository auf Github.