Beiträge
Warum wir einen nativen MCP-Server für Retros gebaut haben

Kelly Lewandowski
Zuletzt aktualisiert am 19/05/20267 Min. Lesezeit
"Nativ" heißt nicht "anderer Code"
/api/v1/-Endpunkten, die jeder mit einem persönlichen Access Token direkt ansprechen kann. Dieselben Handler, dieselben Zod-Schemas, dieselben Berechtigungsprüfungen. Wenn wir in einem eine Regel ändern, zieht der andere mit.Entscheidung 1: weniger Tools, mit Toggles statt Paaren
retro_create_reaction und ein retro_delete_reaction gegeben, genauso wie unsere REST-Routen Create und Delete trennen. Zwei Tools pro Emoji-Reaktion. Multipliziere das über Items und Kommentare und du verbrennst echte Tokens für Rauschen, bevor das Modell etwas Sinnvolles getan hat.retro_toggle_reaction ist ein Tool, das ein Emoji an- oder ausschaltet, je nachdem, ob der Aufrufer bereits reagiert hat. Es gibt "added" oder "removed" in der Antwort zurück, damit das Modell erzählen kann, was passiert ist, ohne Reaktions-IDs zu speichern, die es nur zum Löschen bräuchte.Entscheidung 2: Hinweise in die Beschreibungen schreiben, nicht in die Doku
userId und einen kudoType und gab einen freundlichen Fehler zurück, wenn man jemanden übergab, der nicht im Space war. Modelle haben konsequent eine User-ID erfunden, den Fehler kassiert, sich entschuldigt und den Nutzer gebeten, die richtige ID einzufügen. Nutzlos.retro_create_item, falls keins
existiert). Der Empfänger muss Mitglied des Retro-Space sein — benutzeorganization_list_users (unterstützt einen Suchfilter), um die User-ID
per Namen nachzuschlagen.organization_list_users mit dem Namen auf, den der Nutzer laut gesagt hat, bekommt die ID und vergibt die Kudos in einem Zug. Der Handler hat sich nicht geändert. Der Hinweis schon.
retro_update warnt in der Beschreibung, dass das Löschen einer Spalte auch jedes Item darin löscht. retro_cast_item_vote nennt das Stimmen-Limit pro Board und pro Spalte explizit, damit das Modell den Nutzer vorab informieren kann, bevor es in den 400er rennt. Jedes "das musst du wissen, um mich richtig aufzurufen" landet im Tool selbst, nicht in einem separaten Guide, den niemand liest.Entscheidung 3: ein semantisches Such-Tool, keine List-and-Filter-Kette
retro_list aufruft, dann retro_list_items für jedes Ergebnis, und alles in den Kontext lädt. Das ist ein Tool-Call-Sturm, der den Nutzer Geld kostet und eine schlechtere Antwort produziert als grep.search-Tool gebaut, das semantische Suche über den gesamten Space auf einmal ausführt. Es liefert Retro-Items, Kommentare, Action Items, Standup-Antworten, Umfrageantworten, Eisbrecher-Antworten und Notizen, sortiert nach Kosinus-Ähnlichkeit gegenüber der Anfrage, gruppiert nach Typ. Das Modell bekommt die relevanten 20 Ergebnisse in einem Aufruf, statt sich über hunderte Datensätze zu verteilen.Entscheidung 4: Zustimmung pro Feature zum OAuth-Zeitpunkt
Was das am Retro-Board bedeutet
Das Board vorbereiten
"Öffne das Retro dieses Sprints und füge Items aus den Postmortems hinzu, die wir die letzten zwei Wochen in Linear geschrieben haben, eins pro Vorfall, in der Spalte What Could Improve." Das Modell legt die Items an, markiert sie anonym, wo das Quell-Ticket es war, und hört auf. Kontext aus alten Retros finden
"Haben wir schon mal über CI-Flakiness gesprochen?" Semantische Suche liefert die drei Retros, in denen es aufkam, und die Action Items, die daraus entstanden sind — in einem Aufruf. Diskussion in Action Items übersetzen
"Mach aus den drei meistgewählten Items auf dem Board Action Items, weise sie jeweils der Person zu, die sie geschrieben hat, fällig Freitag." retro_list_itemsund dann ein paaraction_item_create-Aufrufe. Das Modell macht die Zuweisung über den Item-Autor.Kudos per Namen vergeben
"Gib Priya Kudos dafür, dass sie die Migration entblockt hat." Das Modell ruft organization_list_usersmit einer Suche nach "Priya" auf und hängt dann die Kudos an.
Was wir wieder so machen würden, was wir uns sparen würden
retro_get-Tool einzubacken. Modelle haben dann die Zusammenfassung zusammengefasst, und die Latenz verdreifachte sich. Langweilig hat gewonnen. Das MCP-Tool gibt dieselbe Form zurück wie der REST-Endpunkt. KI obendrauf ist Sache des Nutzers per Prompt, nicht etwas, was wir ins Protokoll einbacken./api/v1/-Handlern. Die interessante Arbeit steckt in den Tool-Definitionen:
Benennung, Gruppierung, Hinweise und welche Aktionen zu einem einzigen Toggle
zusammengelegt werden. Die Backend-Logik ist geteilt.retro_create_item akzeptiert ein anonymous
-Flag, und retro_create_item_comment auch. Wenn gesetzt, lässt die
Antwort die Autor-User-ID weg, genauso wie das UI es macht. Anonymität wird auf
Handler-Ebene erzwungen, nicht in der Beschreibung.retro_update warnt davor, dass das
Löschen einer Spalte auch jedes Item darin löscht. Wir verlassen uns darauf,
dass das Modell das dem Nutzer vor dem Aufruf zeigt — genauso wie ein
Entwickler, der die Doku liest, die Warnung bemerken würde. Es gibt keinen
separaten Bestätigungsschritt im Protokoll.