feat: lokaler MCP-Server, Phase 3 (kleinteilige Unit/Lesson-Tools)

Statt eines "update_lesson", das die ganze Stunde inkl. Verlaufsplan als
ein großes JSON-Objekt tauscht, gezielte kleine Tools je Teiloperation
(Nutzervorschlag): create/update_unit, create/update_lesson (Metadaten
ohne Phasen), add/update/remove_lesson_phase (je eine Phase),
download_lesson_attachment (Base64, auf 3 MB gedeckelt). Verkürzt das
Lesen-Schreiben-Zeitfenster je Operation und liefert lesbare Diffs für
den Bestätigungsdialog statt eines Objekt-Dumps.

ILessonRepository um GetById ergänzt (fehlte bisher, war aber
Voraussetzung für jedes der neuen Tools). get_lesson_plans liefert jetzt
zusätzlich Phase-IDs und Attachment-Metadaten, damit ein Client sie
gezielt referenzieren kann.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-11 21:52:48 +02:00
co-authored by Claude Sonnet 5
parent 0c60a54c4d
commit dd2e1e7c61
9 changed files with 496 additions and 16 deletions
+32
View File
@@ -2557,6 +2557,38 @@ folgenden Punkte gehören direkt in `LehrerApp.Desktop`:
MCP-Client, der auf `build/LehrerApp.app/Contents/MacOS/LehrerApp.McpBridge` zeigt, gegen
die laufende App testen.
- [x] **4.5.28** Lokaler MCP-Server, Phase 3 (kleinteilige Unit/Lesson-Tools), 2026-09-11: statt
eines einzelnen `update_lesson`, das die komplette Stunde inkl. Verlaufsplan als ein großes
JSON-Objekt tauscht, gezielt kleine Tools je Teil-Operation — auf Nutzervorschlag: `Lesson`
ist zwar technisch ein eingebettetes LiteDB-Dokument ohne Zeilen-Locking auf DB-Ebene, aber
kleinteilige Tools verkürzen das Lesen-Schreiben-Zeitfenster je Operation drastisch und
liefern einen für den Bestätigungsdialog tatsächlich lesbaren Diff statt eines
Objekt-Dumps. Ein Tool, das die ganze Stunde überschreibt, wurde bewusst NICHT gebaut.
- **Neue Tools:** `create_unit`/`update_unit` (Einheiten-Metadaten), `create_lesson` (ohne
Phasen; übernimmt `GroupId` automatisch von der übergeordneten `Unit`, kein eigener
`groupId`-Parameter — verhindert Inkonsistenz zwischen Lesson und Unit),
`update_lesson` (Metadaten, Phasen bleiben unangetastet), `add_lesson_phase`/
`update_lesson_phase`/`remove_lesson_phase` (je eine `LessonPhaseStep`), sowie
`download_lesson_attachment` (Read-Tool, Base64, gedeckelt auf
`LessonPlanTools.MaxInlineAttachmentBytes` = 3 MB — größere Anhänge liefern einen klaren
Fehler statt einer aufgeblähten Antwort; echtes MCP-Resource-Streaming für große Dateien
bleibt ein offener Punkt, siehe Planungsdokument).
- **`ILessonRepository` um `GetById(Guid id)` ergänzt** (fehlte bisher komplett -
`GetByUnit`/`GetByGroupAndDate`/`GetByGroupAndRange` decken keinen Einzelabruf per ID ab).
Ohne diese Methode wäre kein einziges der neuen Lesson-Tools möglich gewesen, da sie alle
eine bestehende Stunde gezielt nachladen müssen. `LessonRepository.GetById` delegiert auf
das bereits intern (in `Delete`) genutzte `db.Lessons.FindById(id)`.
- `get_lesson_plans` liefert jetzt zusätzlich `Attachments` (Speicher-ID + Dateiname +
Größe) je Stunde und `Phases` inklusive `Id` je Phase — beides war vorher nicht
exponiert und ist Voraussetzung dafür, dass ein KI-Client eine Phase oder einen Anhang
gezielt referenzieren kann.
- `McpToolScope`/`McpServerHostedService` entsprechend erweitert (7 Read-, 10 Write-Tools
insgesamt), 14 neue Unit-Tests in
[McpToolsTests.cs](LehrerApp.Desktop.Tests/McpToolsTests.cs) (jetzt 28), decken u.a. ab:
dass `create_lesson` die Gruppe von der Einheit übernimmt statt einen eigenen Parameter zu
vertrauen, dass `update_lesson`/`update_lesson_phase` wirklich nur die angegebenen Felder
ändern, und dass ein zu großer Anhang beim Download einen Fehler statt einer Antwort liefert.
**Wichtige Abweichung von der ursprünglichen Planung (5.2):** Vor der Umsetzung zeigte sich,
dass 5.2 wie ursprünglich beschrieben eine zweite, parallele Fehlzeiten-Erfassung neben dem
bereits bestehenden Anwesenheits-Tracking aus Kapitel 3 (`ParticipationEntry.Attendance`,