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
- 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 - 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 - 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" } } } - 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.
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
- Vorlagen nach Titel, Stichwort und im Volltext der Dokumente suchen
- für die wichtigen Vorlagen die Beratungsfolge abrufen: welches Gremium, wann, mit welchem Ergebnis
- kommende Sitzungen auf das Thema prüfen
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
- die Vorlage über ihre Drucksachennummer finden
- verwandte Vorlagen lesen: Änderungsanträge, Stellungnahmen, Ergänzungen
- die Beratungsfolge und den Text der Dokumente heranziehen, mit Zitaten
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
- das Gremium und seine nächste Sitzung finden
- die Tagesordnung mit den zugehörigen Vorlagen laden
- 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.
search_papersSearch 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
querystring- Search text, required for the "name" and "keyword" modes. Substring match, case-insensitive.
search_modestring · name | keyword | list · Standard "name"- How to search: "name" (title/reference), "keyword" (broader, no filters), or "list" (no query). Default: "name"
search_fieldsstring[] · NAME | REFERENCE- Which fields "name" mode matches: NAME (title), REFERENCE (e.g. "261572-01 ST"). Default: both
exact_matchboolean · Standard false- In "name" mode, require the whole field to equal the query instead of containing it. Default: false
paper_typestring- 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_afterstring- Only papers published on or after this date (YYYY-MM-DD, inclusive). Ignored in "keyword" mode.
published_beforestring- Only papers published on or before this date (YYYY-MM-DD, inclusive). Ignored in "keyword" mode.
sortstring · newest | oldest | name · Standard "newest"- Sort order: "newest" or "oldest" by publication date, or "name". Default: "newest"
limitinteger · Standard 10- Maximum number of results to return (default: 10, max: 100)
offsetinteger · Standard 0- Number of results to skip; pass the previous next_offset to get the next page (default: 0)
get_paperPaper 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_idstring · Pflicht- Paper id as returned by search_papers, search_fulltext or get_meeting
get_paper_meetingsPaper 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_idstring- Paper id as returned by search_papers or search_fulltext (mutually exclusive with search_query)
search_querystring- Reference number (e.g. "261572-01 ST") or title substring of the paper (mutually exclusive with paper_id)
search_modestring · name | reference · Standard "name"- How search_query is matched: "reference" (exact reference number) or "name" (title substring). Default: "name"
include_agenda_itemsboolean · Standard true- Include the agenda item (number, title, result) of each consultation (default: true)
include_organizationsboolean · Standard true- Include the organizations (committees) holding each meeting (default: true)
search_fulltextSearch 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
querystring · Pflicht- Search terms, e.g. Haushaltsplanung Bäume or "Ratsbeschluss Radweg" -Fußweg
limitinteger · Standard 10- Maximum number of hits to return (default: 10, max: 50)
offsetinteger · Standard 0- Number of hits to skip for pagination (default: 0)
get_file_textRead 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_idstring · Pflicht- File id as returned by search_fulltext
offsetinteger · Standard 0- Character offset to start from (default: 0)
max_charsinteger · Standard 20000- Maximum characters to return (default: 20000, max: 50000)
search_meetingsSearch 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_idstring- Only meetings of this organization (id from search_organizations)
querystring- Text the meeting name contains (case-insensitive)
whenstring · upcoming | past | any · Standard "upcoming"- "upcoming" (from now, soonest first), "past" (before now, most recent first) or "any" (most recent first). Default: "upcoming"
fromstring- Only meetings on or after this date (YYYY-MM-DD)
tostring- Only meetings on or before this date (YYYY-MM-DD)
include_cancelledboolean · Standard false- Also return cancelled meetings. Default: false
limitinteger · Standard 10- Maximum number of results to return (default: 10, max: 100)
offsetinteger · Standard 0- Number of results to skip; pass the previous next_offset to get the next page (default: 0)
get_meetingMeeting 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_idstring · Pflicht- Meeting id as returned by search_meetings
include_non_publicboolean · Standard true- Include the non-public agenda items (titles only; their content is confidential). Default: true
search_organizationsSearch 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
querystring- Text the name or short name contains (case-insensitive). Omit to list all.
classificationstring- Only organizations whose classification contains this text, e.g. "Ratsgremien" (committees), "Bezirksvertretungen", "Fraktion", "Beiräte", "Rat".
include_inactiveboolean · Standard false- Also return bodies that have been dissolved (end date in the past). Default: false
include_administrationboolean · Standard false- Also return administrative departments of the city (Verwaltungsbereiche). Default: false
limitinteger · Standard 20- Maximum number of results to return (default: 20, max: 100)
offsetinteger · Standard 0- Number of results to skip; pass the previous next_offset to get the next page (default: 0)
get_organizationOrganization 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_idstring · Pflicht- Organization id as returned by search_organizations
include_past_membersboolean · Standard false- Also list memberships that have ended. Default: false (current members only)
search_personsSearch 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
querystring · Pflicht- Name or part of a name (case-insensitive)
limitinteger · Standard 10- Maximum number of results to return (default: 10, max: 100)
offsetinteger · Standard 0- Number of results to skip; pass the previous next_offset to get the next page (default: 0)
get_personPerson 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_idstring · Pflicht- Person id as returned by search_persons
include_past_membershipsboolean · Standard false- Also list memberships that have ended. Default: false
limitinteger · Standard 10- Maximum number of results to return (default: 10, max: 100)
offsetinteger · Standard 0- Number of results to skip; pass the previous next_offset to get the next page (default: 0)
Prompts
track_topicEin 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.
topicsince(optional)
trace_paperEine 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
prepare_meetingEine 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.