Zum Inhalt springen

Datenbestand · Schnittstellen · MCP

Frag den Rat.

Dieser Datenbestand steht auch als MCP-Server bereit. Über das Model Context Protocol kann ein KI-Assistent wie Claude selbst in Vorlagen, Sitzungen, Gremien und Dokumenttexten der Bundesstadt Bonn nachschlagen — und seine Antworten mit Drucksachennummern und Links belegen.

Adresse des Servers

https://oparl.bonn.machdenstaat.de/mcp
  • Zugang öffentlich, ohne Anmeldung
  • Rechte nur lesend — kein Werkzeug schreibt Daten oder ruft fremde Adressen ab
  • Transport Streamable HTTP, zustandslos
  • Umfang 11 Werkzeuge, 3 vorbereitete Prompts

Einrichten

  1. 01

    Claude Code

    Im Terminal einmal ausführen; danach stehen die Werkzeuge in jeder Sitzung bereit.

    claude mcp add --transport http oparl-bonn https://oparl.bonn.machdenstaat.de/mcp
  2. 02

    Claude (Web und Desktop)

    In den Einstellungen unter „Konnektoren“ (Connectors) einen benutzerdefinierten Konnektor mit dieser Adresse hinzufügen; je nach Tarif verfügbar. Eine Anmeldung beim Server ist nicht nötig.

    https://oparl.bonn.machdenstaat.de/mcp
  3. 03

    Andere Clients mit Streamable HTTP

    Die meisten MCP-Clients lesen eine Konfiguration dieser Form; der genaue Ort steht in deren Dokumentation.

    {
      "mcpServers": {
        "oparl-bonn": {
          "type": "http",
          "url": "https://oparl.bonn.machdenstaat.de/mcp"
        }
      }
    }
  4. 04

    Clients, die nur lokale Server starten

    Das Hilfsprogramm mcp-remote übersetzt zwischen lokalem Prozess und HTTP-Server (benötigt Node.js).

    {
      "mcpServers": {
        "oparl-bonn": {
          "command": "npx",
          "args": [
            "-y",
            "mcp-remote",
            "https://oparl.bonn.machdenstaat.de/mcp"
          ]
        }
      }
    }

Drei Wege hinein

Jeder dieser Wege ist als Prompt hinterlegt; viele Clients bieten Prompts als Schrägstrich-Befehl an. Es geht genauso, die Frage einfach zu stellen.

  1. Eine Bürgerin verfolgt, was aus dem Radweg in ihrer Straße wird.

    Prompt track_topic · Ein Thema verfolgen

    „Was hat die Bonner Politik seit Anfang 2025 zum Radverkehr auf der Adenauerallee beschlossen, und steht dazu etwas auf einer kommenden Tagesordnung?“

    Was der Assistent dafür tut

    1. Vorlagen nach Titel, Stichwort und im Volltext der Dokumente suchen
    2. für die wichtigen Vorlagen die Beratungsfolge abrufen: welches Gremium, wann, mit welchem Ergebnis
    3. kommende Sitzungen auf das Thema prüfen
  2. Ein Journalist rekonstruiert, wie aus einem Antrag ein Beschluss wurde.

    Prompt trace_paper · Eine Vorlage nachverfolgen

    „Rekonstruiere die Geschichte der Vorlage 261092 zur Baumschutzsatzung: Inhalt, Änderungsanträge, Stellungnahmen der Verwaltung und Beratungsfolge bis heute.“

    Was der Assistent dafür tut

    1. die Vorlage über ihre Drucksachennummer finden
    2. verwandte Vorlagen lesen: Änderungsanträge, Stellungnahmen, Ergänzungen
    3. die Beratungsfolge und den Text der Dokumente heranziehen, mit Zitaten
  3. Ein Ratsmitglied bereitet sich auf die nächste Ausschusssitzung vor.

    Prompt prepare_meeting · Eine Sitzung vorbereiten

    „Bereite mich auf die nächste Sitzung des Ausschusses für Mobilität und Verkehr vor: Tagesordnung, worum es bei den Vorlagen geht und wo sie schon beraten wurden.“

    Was der Assistent dafür tut

    1. das Gremium und seine nächste Sitzung finden
    2. die Tagesordnung mit den zugehörigen Vorlagen laden
    3. je Punkt Inhalt und bisherige Beratung zusammenfassen, strittige Punkte markieren

Werkzeuge

Die Beschreibungen stehen hier so, wie der Server sie dem Sprachmodell übergibt — auf Englisch, denn sie sind seine Gebrauchsanweisung. Listen sind seitenweise abrufbar, höchstens 100 Einträge auf einmal.

  1. search_papers

    Search papers

    Find council papers (Vorlagen: Beschlussvorlagen, Anträge, Anfragen, Stellungnahmen der Verwaltung, …) by title or reference number, by keyword, or list them, newest first by default. Modes: "name" matches the title and/or reference number (e.g. "Radweg" or "261572"); "keyword" also matches attached file names and agenda item names, which finds more but ignores the filters; "list" returns all papers matching the filters. Titles are German, so search with German words. This does NOT search the text of the documents: use search_fulltext for that. Each paper says whether its main document has extracted text (has_text), and text_coverage counts them for the page. Paginated: check total_count and pass next_offset to get more.

    10 Parameter
    query string
    Search text, required for the "name" and "keyword" modes. Substring match, case-insensitive.
    search_mode string · name | keyword | list · Standard "name"
    How to search: "name" (title/reference), "keyword" (broader, no filters), or "list" (no query). Default: "name"
    search_fields string[] · NAME | REFERENCE
    Which fields "name" mode matches: NAME (title), REFERENCE (e.g. "261572-01 ST"). Default: both
    exact_match boolean · Standard false
    In "name" mode, require the whole field to equal the query instead of containing it. Default: false
    paper_type string
    Only papers whose type contains this text (case-insensitive), e.g. "Beschlussvorlage", "Antrag", "Bürgerantrag", "Anfrage", "Stellungnahme der Verwaltung", "Mitteilungsvorlage". Ignored in "keyword" mode.
    published_after string
    Only papers published on or after this date (YYYY-MM-DD, inclusive). Ignored in "keyword" mode.
    published_before string
    Only papers published on or before this date (YYYY-MM-DD, inclusive). Ignored in "keyword" mode.
    sort string · newest | oldest | name · Standard "newest"
    Sort order: "newest" or "oldest" by publication date, or "name". Default: "newest"
    limit integer · Standard 10
    Maximum number of results to return (default: 10, max: 100)
    offset integer · Standard 0
    Number of results to skip; pass the previous next_offset to get the next page (default: 0)
  2. get_paper

    Paper details

    One paper in full: type, reference, publication date, who submitted it (persons and/or organizations, e.g. a Fraktion or the administration), its main document (with download URL; has_text says whether get_file_text can read it), and related papers: the paper it amends or answers (superordinated), follow-ups such as amendments and statements (subordinated), and other related papers. Originators are rarely recorded in the source data; the title usually names the submitting group. Use get_paper_meetings for where it was discussed and decided.

    1 Parameter
    paper_id string · Pflicht
    Paper id as returned by search_papers, search_fulltext or get_meeting
  3. get_paper_meetings

    Paper consultations

    The consultation history of one paper: every committee, district council or council session it was put before (Beratungsfolge), in date order, with the meeting, the agenda item and its result (e.g. "beschlossen", "vertagt", "zur Kenntnis genommen"). Identify the paper by paper_id, or by search_query: its exact reference number (search_mode "reference") or a title substring (search_mode "name"; if several papers match, the candidates are returned instead). resolution_has_text false marks a decision document (Beschluss) whose text is not extracted yet: its content is unknown, so do not infer what was or was not decided from it.

    5 Parameter
    paper_id string
    Paper id as returned by search_papers or search_fulltext (mutually exclusive with search_query)
    search_query string
    Reference number (e.g. "261572-01 ST") or title substring of the paper (mutually exclusive with paper_id)
    search_mode string · name | reference · Standard "name"
    How search_query is matched: "reference" (exact reference number) or "name" (title substring). Default: "name"
    include_agenda_items boolean · Standard true
    Include the agenda item (number, title, result) of each consultation (default: true)
    include_organizations boolean · Standard true
    Include the organizations (committees) holding each meeting (default: true)
  4. search_fulltext

    Search document text

    German-stemmed full-text search over the contents of the PDF files attached to papers and meetings (Vorlagen, Beschlüsse, Protokolle). Matches word forms ("Haushaltsplanungen" finds "Haushaltsplanung"), ranks by relevance and returns a snippet with the matches in **bold**, the file name and download URL, and the paper, agenda item or meeting the file belongs to so the answer can cite its source. Supports "exact phrases", -excluded words and "or". Text extraction is still running (about 1,000 PDFs per day), so not every file has text yet: an empty result does not prove a topic is absent from the documents. The result reports coverage: how many PDF files have text so far. Use get_file_text to read more of a hit.

    3 Parameter
    query string · Pflicht
    Search terms, e.g. Haushaltsplanung Bäume or "Ratsbeschluss Radweg" -Fußweg
    limit integer · Standard 10
    Maximum number of hits to return (default: 10, max: 50)
    offset integer · Standard 0
    Number of hits to skip for pagination (default: 0)
  5. get_file_text

    Read document text

    Read the extracted plain text of one file (use the file id from search_fulltext), in slices. Returns up to max_chars characters (default 20000, hard cap 50000) from offset, plus total_chars and next_offset (null at the end) so long documents can be paged through. The text comes from a PDF extraction run; Text extraction is still running (about 1,000 PDFs per day), so not every file has text yet: an empty result does not prove a topic is absent from the documents.

    3 Parameter
    file_id string · Pflicht
    File id as returned by search_fulltext
    offset integer · Standard 0
    Character offset to start from (default: 0)
    max_chars integer · Standard 20000
    Maximum characters to return (default: 20000, max: 50000)
  6. search_meetings

    Search meetings

    Find meetings (Sitzungen) of the council, its committees and district councils. Upcoming meetings, soonest first, by default; "past" lists the most recent first. Narrow by organization_id (from search_organizations) to get the meetings of one committee, by a date window, or by name (meeting names look like "Sitzung des Ausschusses für Mobilität und Verkehr"). Use get_meeting for the agenda. Agendas are often published only a week or two before a meeting, so an upcoming meeting may have none yet.

    8 Parameter
    organization_id string
    Only meetings of this organization (id from search_organizations)
    query string
    Text the meeting name contains (case-insensitive)
    when string · upcoming | past | any · Standard "upcoming"
    "upcoming" (from now, soonest first), "past" (before now, most recent first) or "any" (most recent first). Default: "upcoming"
    from string
    Only meetings on or after this date (YYYY-MM-DD)
    to string
    Only meetings on or before this date (YYYY-MM-DD)
    include_cancelled boolean · Standard false
    Also return cancelled meetings. Default: false
    limit integer · Standard 10
    Maximum number of results to return (default: 10, max: 100)
    offset integer · Standard 0
    Number of results to skip; pass the previous next_offset to get the next page (default: 0)
  7. get_meeting

    Meeting agenda

    One meeting with its full agenda (Tagesordnung): each agenda item with number, title, whether it is public, its result (e.g. "beschlossen", "vertagt") and the paper it deals with, where known; plus the documents of the meeting (invitation, results and verbatim minutes, attachments) with download URLs. Document ids work with get_file_text. Get the meeting id from search_meetings.

    2 Parameter
    meeting_id string · Pflicht
    Meeting id as returned by search_meetings
    include_non_public boolean · Standard true
    Include the non-public agenda items (titles only; their content is confidential). Default: true
  8. search_organizations

    Search organizations

    Find the bodies of the city council: the council (Rat), its committees (Ausschüsse), district councils (Bezirksvertretungen), advisory boards (Beiräte), parliamentary groups (Fraktionen, Gruppen) and the supervisory boards of municipal companies. Matches name and short name, e.g. "Mobilität" or "Planung". Use the returned id with get_organization (members) or search_meetings (its meetings). By default only bodies that still exist are returned and administrative departments are left out.

    6 Parameter
    query string
    Text the name or short name contains (case-insensitive). Omit to list all.
    classification string
    Only organizations whose classification contains this text, e.g. "Ratsgremien" (committees), "Bezirksvertretungen", "Fraktion", "Beiräte", "Rat".
    include_inactive boolean · Standard false
    Also return bodies that have been dissolved (end date in the past). Default: false
    include_administration boolean · Standard false
    Also return administrative departments of the city (Verwaltungsbereiche). Default: false
    limit integer · Standard 20
    Maximum number of results to return (default: 20, max: 100)
    offset integer · Standard 0
    Number of results to skip; pass the previous next_offset to get the next page (default: 0)
  9. get_organization

    Organization details and members

    One council body with its members: each person with role (e.g. "Vorsitz", "Mitglied", "Mitglied (Stv.)"), voting right and term, plus how many meetings it has held and its next and most recent meeting. Current members only by default. Get the id from search_organizations.

    2 Parameter
    organization_id string · Pflicht
    Organization id as returned by search_organizations
    include_past_members boolean · Standard false
    Also list memberships that have ended. Default: false (current members only)
  10. search_persons

    Search persons

    Find council members and other persons recorded in the council information system by name (full, given or family name, e.g. "Dörner"). Each hit lists the bodies the person currently belongs to. Use get_person for all memberships and the papers the person submitted.

    3 Parameter
    query string · Pflicht
    Name or part of a name (case-insensitive)
    limit integer · Standard 10
    Maximum number of results to return (default: 10, max: 100)
    offset integer · Standard 0
    Number of results to skip; pass the previous next_offset to get the next page (default: 0)
  11. get_person

    Person details

    One person: their memberships in council bodies (role, voting right, term) and the papers they submitted (originated), newest first. Current memberships only by default. Originators are rarely recorded in the source data, so an empty paper list does not mean the person submitted nothing: search_papers for their Fraktion name (e.g. "SPD-Fraktion") finds motions by title. Get the id from search_persons or get_organization.

    4 Parameter
    person_id string · Pflicht
    Person id as returned by search_persons
    include_past_memberships boolean · Standard false
    Also list memberships that have ended. Default: false
    limit integer · Standard 10
    Maximum number of results to return (default: 10, max: 100)
    offset integer · Standard 0
    Number of results to skip; pass the previous next_offset to get the next page (default: 0)

Prompts

  1. track_topic

    Ein Thema verfolgen

    Was hat die Bonner Politik zu einem Thema beschlossen, und was steht als Nächstes an? Für Bürgerinnen und Bürger, die ein Anliegen im Blick behalten wollen.

    • topic
    • since (optional)
  2. trace_paper

    Eine Vorlage nachverfolgen

    Die Geschichte einer Vorlage von der Einbringung bis zum Beschluss: Inhalt, Änderungsanträge, Stellungnahmen und Beratungsfolge. Für Recherchen von Journalistinnen und Journalisten.

    • paper
  3. prepare_meeting

    Eine Sitzung vorbereiten

    Eine Vorbereitungsmappe für die nächste Sitzung eines Ausschusses, einer Bezirksvertretung oder des Rates: Tagesordnung, Vorlagen und ihre Vorgeschichte. Für Ratsmitglieder, Sachkundige und Interessierte.

    • committee

Grenzen

  • Der Bestand wird schrittweise aus dem Ratsinformationssystem übernommen und ist nicht vollständig. Wie weit der Abgleich ist →
  • Die Texte der PDF-Dokumente werden nach und nach extrahiert. Findet die Volltextsuche nichts, heißt das nicht, dass ein Thema in den Dokumenten fehlt.
  • Manche Verknüpfungen fehlen in den Quelldaten, etwa wer eine Vorlage eingebracht hat. Die Werkzeuge sagen das in ihren Beschreibungen, damit der Assistent nicht aus einer leeren Liste falsche Schlüsse zieht.
  • Ein Sprachmodell kann sich trotzdem irren. Prüfen Sie wichtige Aussagen an der verlinkten Vorlage oder Sitzung.

Für Entwickler Dieselben Daten liegen als GraphQL-Schnittstelle unter https://oparl.bonn.machdenstaat.de/graphql. Der Quellcode des MCP-Servers liegt in apps/oparl-mcp.