Hilfe & Anleitung
Hier stehen alle Termine des Kommunalwahlkampfs an einem Ort: ansehen, zusagen, eigene Termine anlegen. Der erste Reiter erklärt das Schritt für Schritt, der zweite ist die technische Referenz.
Was ist das hier?
Eine gemeinsame Terminübersicht für den Kommunalwahlkampf 2026 im CDU-Kreisverband Hildesheim. Wer angemeldet ist, sieht alle Termine, sagt mit einem Klick zu oder ab und kann selbst einen Termin anlegen — etwa einen Wahlkampfstand. Wer mag, kann das Ganze zusätzlich mit einer KI steuern; nötig ist das nicht.
Dieses Werkzeug ist ein privates Angebot von Levin Keller als Idee für den Kreisverband, kein offizielles Angebot der CDU. Näheres im Impressum.
Noch kein Zugang? In drei Schritten dabei
Die Anmeldung läuft über ein kostenloses Konto bei GitHub. Das klingt nach Programmieren, ist hier aber nur die Anmeldung — so wie man sich anderswo „mit Google" anmeldet. Du brauchst dort nichts zu können und nichts zu tun; das Konto ist in etwa zwei Minuten angelegt.
- Auf github.com ein Konto anlegen: E-Mail-Adresse, Passwort, ein Benutzername. Merk dir den Benutzernamen — den brauchst du gleich.
-
Schreib eine kurze Mail an
post@levinkeller.de mit deinem
Benutzernamen und deinem Verband. Du wirst dann in die Organisation
cdu-kv-hildesheimaufgenommen — das ist die Liste der Leute, die hier Zugang haben. - Du bekommst eine Einladung per Mail. Einmal bestätigen, dann hier oben auf Anmelden klicken — fertig.
Was du davon hast:
- Deine Termine landen im Kalender auf dem Telefon. Unter Mein Bereich gibt es einen persönlichen Kalender-Link. Einmal eingetragen, taucht jeder Termin, zu dem du zugesagt hast, automatisch im Kalender auf — auch wenn sich Uhrzeit oder Ort später ändern.
- Deine Zusage zählt auf dich, nicht auf einen Gast. Und du siehst, wer sonst zugesagt hat — bei den Aktionen deiner eigenen Kampagnen; ohne Konto sieht man nur Zahlen.
- Du siehst alles, nicht nur den einen Link: alle Termine samt der Aktionen aller Kampagnen, filterbar nach Wahlart und Kommune, dazu die Sammlungen. Aktionen fremder Kampagnen kannst du öffnen und mitlesen — zusagen und sehen, wer dort zugesagt hat, kann nur, wer in der Kampagne ist.
Ganz ohne Konto geht auch etwas: Wer einen geteilten Termin-Link bekommt, kann dort mit seinem Namen zusagen. Für alles Weitere braucht es die Anmeldung.
Was du im Browser machen kannst
- Termine ansehen und zu- oder absagen: auf die Terminliste gehen, Termin öffnen, klicken.
- Zwischen Woche, Monat und Liste umschalten und vor- oder zurückblättern: die Leiste über dem Kalender auf Termine und jeder Sammlung. Am Telefon ist die Liste voreingestellt, am Rechner der Monat. Der gewählte Ausschnitt steht in der Adresse — ein weitergegebener Link zeigt genau das, was du gerade siehst.
- Nach Wahlart und Kommune filtern: unter der Suche auf Termine klappt „Filter" auf. Ein Klick auf Ortsrat zeigt alle Ortsratswahlen auf einen Blick, ein Klick auf eine Kommune alles, was dort läuft; beides lässt sich kombinieren. Liegt im gerade gezeigten Monat nichts mehr, springt der Kalender nach dem Filterklick zum nächsten Treffer — du musst nicht selbst blättern. Die Auswahl steht in der Adresse — zusammen mit Woche/Monat/Liste. Ein weitergegebener Link zeigt also denselben Ausschnitt mit denselben Filtern, auch einen leeren Monat. Termine, die keiner Kampagne zugeordnet sind, haben weder Wahlart noch Kommune und sind bei aktivem Filter ausgeblendet; die Seite sagt dazu, wie viele das sind.
- Einen eigenen Termin anlegen (z. B. einen Wahlkampfstand): als Mitglied einer Kampagne findest du auf der Terminliste den Knopf „+ Neuer Termin". Trag neben dem Beginn auch ein Ende ein — sonst steht der Termin im Kalender pauschal mit zwei Stunden.
- Den öffentlichen Zusage-Link kopieren und weitergeben (siehe unten).
- Deinen Kalender-Link holen unter Mein Bereich.
Alles Weitere läuft über die KI: Termine ändern oder löschen, Aktionen anlegen (einzelne Schichten oder Aufgaben an einem Termin), Verantwortliche eintragen, Sammlungen pflegen, Auswertungen wie ein Newsletter-Text.
Helfer ohne Konto einladen
Jeder Termin hat einen öffentlichen Zusage-Link, den du auf der Termin-Seite kopierst. Wer ihn per WhatsApp oder Mail bekommt, trägt seinen Namen ein und sagt zu — ohne Konto. Öffentlich sichtbar sind nur Zahlen: wie viele zugesagt haben, wie viele gebraucht werden und wie viele noch fehlen. Gerade das „noch 2 gesucht" bringt Leute zum Eintragen. Die Namen siehst nur du als angemeldetes Mitglied. Bist du selbst angemeldet und öffnest so einen Link, zählt deine Zusage auf dein Konto.
Beim Verschicken entsteht automatisch eine Vorschau. Darin steht, wie viele Leute gebraucht werden („4 Personen gesucht") — nicht, wie viele noch fehlen. Das hat einen Grund: WhatsApp und Signal merken sich diese Vorschau einmal und aktualisieren sie nie wieder. Eine Fehlzahl wäre schon am nächsten Tag falsch und würde Leute zu einer längst vollen Schicht schicken. Der Bedarf ändert sich dagegen nur, wenn ihn jemand bewusst umstellt. Wie viele noch fehlen, steht auf der Seite selbst — die ist immer aktuell.
Einzelne Schichten teilen: Auch jede Aktion hat einen eigenen öffentlichen Zusage-Link — auf ihrer Seite steht er im selben Kasten zum Kopieren. Das ist der Weg für eine Aktion, die an keinem Termin hängt (etwa ein eigener Stand der Kampagne): sie hätte sonst überhaupt keinen Link nach draußen. Hängt die Aktion dagegen an einem Termin, führt der Link auf die öffentliche Termin-Seite, weil dort alle Schichten nebeneinander stehen und man sich die passende aussuchen kann.
Ist ein Link in falsche Hände geraten, lässt er sich über die KI erneuern („Erneuere den öffentlichen Link für …"). Der alte Link führt danach ins Leere; wer schon zugesagt hat, bleibt eingetragen.
Für eine ganze Zielgruppe gibt es Sammlungen: eine öffentliche Seite mit allen kommenden Terminen ausgewählter Kampagnen, ebenfalls ohne Konto. Angelegt werden sie über die KI.
Wer kümmert sich? (Verantwortliche)
Zu jedem Termin lassen sich Verantwortliche hinterlegen — mit Funktion, Telefon und E-Mail. Wer auf den Termin schaut, sieht sofort, an wen er sich wenden kann; auf dem Handy genügt ein Tipp auf die Nummer, und die Angaben stehen auch im Kalendereintrag. Eintragen über die KI: „Trag beim Infostand am Samstag Anna Meier als Standleitung ein, Telefon 0511 123456."
Diese Kontaktdaten sind öffentlich sichtbar — auch für Leute ohne Konto, die einen geteilten Link öffnen. Trag deshalb nur Daten ein, mit deren Veröffentlichung die Person einverstanden ist. Im Zweifel lieber vorher fragen oder eine dienstliche Nummer nehmen.
Kalender-Abo (ICS)
Den persönlichen Kalender-Link findest du unter Mein Bereich. Trag ihn in deinem Kalenderprogramm ein — bei Apple Datei → Neues Kalenderabo, bei Google Andere Kalender → Per URL hinzufügen, bei Outlook Kalender hinzufügen → Aus dem Internet abonnieren. Wichtig: nicht „importieren" (Einmalimport), sondern „abonnieren" — dann aktualisiert er sich von selbst. Alle Uhrzeiten sind deutsche Zeit; ohne eingetragenes Ende dauert ein Termin im Kalender pauschal zwei Stunden, ohne Uhrzeit steht er ganztägig drin.
Mit einer KI arbeiten (freiwillig)
Eine KI wie Claude oder Le Chat kann nicht nur Text schreiben, sondern über eine Schnittstelle namens MCP auch mit einem Programm sprechen. Dieses Werkzeug bietet so eine Schnittstelle an: Wenn du es einmal verbindest, kannst du in normalen Sätzen Termine anlegen, ändern oder auswerten lassen — und zwar nur so viel, wie du selbst auch darfst.
Dafür brauchst du entweder Claude.ai mit bezahltem Tarif
(mindestens Pro; der kostenlose erlaubt keine eigenen
Connectors) oder Le Chat von Mistral, wo der kostenlose
Tarif reicht. Die Adresse, die du dort einträgst, ist immer dieselbe:
https://wahlkampf.levinkeller.de/mcp
- Claude.ai: oben rechts auf deinen Namen, Settings → Connectors → Add custom connector. URL eintragen, Name z. B. Wahlkampf CDU.
- Le Chat: Seitenleiste Connectors → + Add Connector → Custom MCP Connector, dieselbe URL.
- Beide leiten dich kurz hierher weiter: über GitHub anmelden, Authorize bestätigen.
- Zurück im Chat den neuen Connector aktivieren — beim Werkzeug-Symbol.
Danach genügen normale Sätze, zum Beispiel:
- „Zeig mir alle anstehenden Termine."
- „Leg einen Wahlkampfstand am 3. Mai 2026, 9 bis 12 Uhr, Marktplatz Adensen an."
- „Schreib mir die nächsten 10 Termine als Text für den Newsletter."
Wenn die KI unsicher ist, was sie kann: kopier ihr einmal den Kontext-Block ganz unten in den Chat.
Wenn etwas nicht funktioniert
- Login klappt nicht: Dein GitHub-Konto ist vermutlich noch nicht in der Organisation
cdu-kv-hildesheim— siehe die drei Schritte oben. - „Not a member of kampagne-…": Du gehörst nicht zu dieser Kampagne. Bitte den zuständigen Maintainer, dich aufzunehmen.
- Die KI erfindet Antworten: schreib „Nutze dafür nur Werkzeuge, nicht raten."
- Connector verloren: in den Einstellungen der KI neu verbinden. Deine Daten hier bleiben erhalten.
Nachschlagteil für alle, die schon wissen, was MCP ist. Für den Einstieg genügt der Reiter Anleitung.
Quick Facts
- MCP-Endpoint:
https://wahlkampf.levinkeller.de/mcp— als Custom Connector eintragen, DCR und PKCE macht der Client selbst. - Auth: OAuth 2.1 mit Dynamic Client Registration (RFC 7591), PKCE, Bearer-Token
- Transport: JSON-RPC 2.0 via HTTP POST, kein SSE
- Identität: GitHub-OAuth, gekoppelt an Organisations-Mitgliedschaft
- Sichtbarkeit: Jedes angemeldete Mitglied sieht alle Termine und alle Aktionen — in der Weboberfläche und über MCP gleichermaßen. Zusagen und Namenslisten einer Aktion bleiben dagegen ihrem Kampagnen-Team vorbehalten (Maintainer von
kampagne-*-Teams dürfen überall); eine fremde Aktion lässt sich also öffnen und lesen, aber nicht zusagen. - Aktionen entstehen ausschließlich über MCP — die Weboberfläche hat dafür kein Formular.
- Clients: Claude.ai ab Pro, Le Chat in allen Tarifen, Claude Desktop per Configdatei. ChatGPT unterstützt keine Custom MCP Server.
Verfügbare Tools
| Tool | Zweck |
|---|---|
list_events | Events auflisten (Filter: campaign_slug, location_tags, upcoming_only) |
get_event | Event + alle seine Aktionen mit Besetzungszahlen |
create_event | Event anlegen (Maintainer). Optional time/end_time (HH:MM) für Beginn und Ende. rsvp_enabled=true = eigenes Event, auf das man direkt zusagen kann (ohne Aktion); aus = externe Veranstaltung (Zusage nur über Aktionen) |
update_event | Event bearbeiten (Maintainer), z. B. end_time nachtragen |
delete_event | Event löschen, Cascade auf Aktionen/RSVPs (Maintainer) |
list_event_contacts | Verantwortliche eines Termins (Name, Funktion, Telefon, E-Mail, freie Zusatzfelder) |
add_event_contact | Verantwortliche Person eintragen (Maintainer). Pflicht: event_id, name; optional role, phone, email, note, meta |
update_event_contact / remove_event_contact | Einzelnen Eintrag ändern/entfernen, adressiert über die Kontakt-id (Maintainer) |
set_event_contacts | Alle Verantwortlichen eines Termins auf einmal ersetzen — für „A und B kümmern sich“. Leere Liste = alle entfernen (Maintainer) |
list_actions | Alle Aktionen — dieselbe Menge, die die Weboberfläche zeigt; je Aktion mit public_url (öffentlicher Zusage-Link ohne Login) |
create_action | Aktion anlegen — an ein Event angehängt oder eigenständig mit eigenem Datum/Ort (und optional time/end_time); Team-Mitglied |
update_action / delete_action | Aktion ändern/löschen (Team-Mitglied) |
add_event_to_campaign / remove_event_from_campaign | Öffentliches Event ohne Aktion einer Kampagne zuordnen — es erscheint dann unter deren Wahlart/Kommune und in ihren Sammlungen (Team-Mitglied) |
rsvp | Eigene Zusage setzen (yes/no/maybe) — für eine Aktion (action_id, nur als Mitglied ihrer Kampagne) oder ein eigenes Event (event_id, für alle) |
list_attendees | Teilnehmerliste einer Aktion (nur als Mitglied ihrer Kampagne) oder eines eigenen Events — Konto-Zusagen (kind="account", mit GitHub-Profil-URL) und Gast-Zusagen über den öffentlichen Link (kind="guest", nur Name + guest_rsvp_id) |
delete_guest_rsvp | Eine Gast-Zusage entfernen (Fehlklick, Doublette), adressiert über die guest_rsvp_id aus list_attendees; Team-Mitglied der zuständigen Kampagne |
delete_rsvp | Konto-Zusage entfernen — eigene immer, fremde als Team-Mitglied der zuständigen Kampagne (github_username angeben) |
list_my_rsvps | Eigene Zusagen |
list_campaigns | Alle Kampagnen der Organisation |
list_members | Team-Mitglieder einer Kampagne |
get_campaign_info / update_campaign_info | Metadaten einer Kampagne inkl. wahlart/kommune — danach lässt sich die Terminliste filtern |
create_collection / update_collection / delete_collection | Kuratierte öffentliche Sammlung (Themenseite) aus mehreren Kampagnen; Maintainer |
list_collections / get_collection | Sammlungen + öffentlicher Link (/s/<slug>?key=<token>); get_collection inkl. kommender Termine |
rotate_collection_link | Erneuert den geheimen key einer Sammlung; alte Links brechen (Maintainer) |
rotate_public_link | Erneuert den öffentlichen Zusage-Link eines Termins (event_id, Maintainer) oder einer Aktion (action_id, Team-Mitglied); der alte Link läuft ins Leere, Zusagen bleiben |
get_preferences / set_preferences | Eigener location_tags-Filter |
get_dashboard | Overview mit URLs |
export_events_as_text | Bullet-Liste für Newsletter, mit Deeplinks |
get_my_ics_url | Eigener ICS-Kalender-Abo-Link |
Deeplinks und ICS
Jedes Response-Objekt enthält url (und bei Aktionen an einem
Event zusätzlich event_url). Events und Aktionen
enthalten außerdem
public_url — einen öffentlichen Zusage-Link ohne Login, über
den Helfer ohne Konto mit Namen zusagen (öffentlich sichtbar ist nur die
Anzahl). Bei einer Aktion an einem Termin führt dieser Link auf die
öffentliche Termin-Seite mit allen Schichten; eigenständige Aktionen
haben dort ihren einzigen Weg nach draußen. get_my_ics_url liefert den signierten Abo-Link zum
eigenen Kalender; er steht auch unter Mein Bereich.
Prompt-Patterns
- Tool-Nutzung erzwingen: „Rufe
list_eventsmitupcoming_only=trueauf." - Batch-Arbeit: „Erstelle für folgende Liste je ein Event" — die KI loopt das durch, das Tool hat keinen Bulk-Insert.
- Newsletter:
export_events_as_textgibt Deeplinks direkt als Markdown mit aus.
Kontext-Block zum Kopieren (für deine KI)
Paste diesen Block einmal oben in deinen Chat. Danach weiß deine KI, wie sie mit dem Tool arbeitet, ohne raten zu müssen.