fix(tools): harden OpenWebUI tool workflows

This commit is contained in:
Mikei386 committed 2026-08-24 00:40:32 +02:00
1 parent bfb990a4fd
commit e24839bfe1
24 files changed
+505 -100

No files matched your search

+4 -4
View File
@@ -29,7 +29,7 @@ Heimnetz / VPN-Clients
| +-- Piper-TTS (CPU, automatischer Fallback)
+-- internes MCP-Netz
+-- Web-MCP + SearXNG + TinySearch/Crawl4AI + YouTube-Adapter
+-- offizieller GitHub-MCP (vier read-only Werkzeuge)
+-- offizieller GitHub-MCP (drei kleine read-only Werkzeuge)
+-- Home-Assistant-MCP-Relay
+-- ARR-MCP
+-- Unraid-MCP
@@ -61,7 +61,7 @@ Alle Profile verwenden dasselbe selbst gebaute llama.cpp-Image. Separate,
normalerweise gestoppte Containerdefinitionen halten Parameter wie Kontext,
MTP und CPU-Offload reproduzierbar. Ein Wechsel stoppt das alte Profil und
startet genau einen bereits angelegten Container. Dadurch lassen sich Profile
einzeln verändern oder duplizieren, ohne vier Modelle parallel im VRAM zu
einzeln verändern oder duplizieren, ohne mehrere Modelle parallel im VRAM zu
halten.
| Profil | Ausgangswert | Zweck |
@@ -158,9 +158,9 @@ weitere MCP-Clients ──────┴── mcp-gateway (später) ── das
| Container | Werkzeugbereich | Standardrecht |
|---|---|---|
| `web-mcp` | Websuche, Seitenabruf, YouTube/Transkripte, Hugging Face und öffentliche Quellen | nur lesen; begrenzte Aufrufschleifen |
| `web-mcp` | manuell zugeschaltete Spezialabfragen für YouTube und Hugging Face | nur lesen; begrenzte Aufrufschleifen |
| `platform-context-mcp` | Architektur, Quellen, Snapshot und Docs-Pflege | kein Docker-Socket; Docs nur Preview/Approval |
| `github-mcp-read` | Repositorysuche, Baum, Dateiinhalt und Code-Suche | vier Tools, strikt nur lesen |
| `github-mcp-read` | Repositorysuche, gezielte Datei- und Code-Suche | drei Tools, strikt nur lesen |
| `home-assistant-mcp-read` | Entities, Bereiche, Historie, Diagnose | nur lesen |
| `home-assistant-mcp-write` | kontrollierte HA-Änderungen | Preview/Approval |
| `arr-mcp-read` | Sonarr/Radarr-Status und Releasesuche | nur lesen |
+1 -1
View File
@@ -11,7 +11,7 @@
| Home-Assistant-MCP | HA-Endpunkt plus lokaler Relay | eigener optionaler Container | optional |
| ARR-MCP | `arr-mcp` 1.0.1 plus dokumentierter Sonarr-Patch | eigener optionaler Container | optional |
| Navidrome-MCP | Blakeem/Navidrome-MCP 2.2.0, Image per OCI-Digest | eigener optionaler Container ohne mpv | optional |
| GitHub-MCP | offizieller `github/github-mcp-server` 1.10.1, vier read-only Werkzeuge | eigener optionaler Container hinter Streamable-HTTP-Brücke | optional |
| GitHub-MCP | offizieller `github/github-mcp-server` 1.10.1, drei begrenzte read-only Werkzeuge | eigener optionaler Container hinter Streamable-HTTP-Brücke | optional |
| Platform Context MCP | Athena-/MikeAI-Wissen, begrenzter Laufzeitsnapshot und kontrollierte Dokumentationspflege | eigener Container ohne Docker-Socket, Shell, Egress oder Secrets | Kern |
| Athena Operator MCP | Entwicklung und vollständiger Betrieb der KI-Plattform mit gebundenen Freigaben | unprivilegierte MCP-Fassade plus rootseitiger strukturierter Executor; keine freie Shell | Kern |
| Operator-Kontext | `docs/QWEN_OPERATOR_CONTEXT.md` plus `config/operator-system-prompt.txt` | versionierte Selbstbeschreibung und Sicherheitsregeln für Qwen | Kern |
+7 -5
View File
@@ -167,15 +167,17 @@ Aktuell existieren funktionale Adapter für:
- Websuche
- Home Assistant
- Sonarr/Radarr
- GitHub Repository read-only (offizieller Server, vier Werkzeuge)
- GitHub Repository read-only (offizieller Server, drei begrenzte Werkzeuge)
- Navidrome-Bibliothek und Last.fm-Empfehlungen
- Unraid read-only
- eigener Unraid-Administrationsserver
OpenWebUI bindet diese Kataloge nicht pauschal an jedes Modellprofil. Der
lokale `MikeAI Auto Tool Selector` ergänzt anhand der jüngsten Nutzernachricht
höchstens zwei passende MCP-Verbindungen pro Anfrage. Dadurch bleiben normale
Chats schemafrei und kurze Profile verlieren keinen unnötigen Kontext. MUA
höchstens zwei passende Fach-MCP-Verbindungen pro Anfrage. Allgemeine
Webrecherche erfolgt über Open WebUIs native `search_web`/`fetch_url`-Werkzeuge;
`web-local` ist nur noch manuell für Spezialfälle verfügbar. Dadurch bleiben
Fachkataloge klein und kurze Profile verlieren keinen unnötigen Kontext. MUA
mit erweiterten Verwaltungsrechten bleibt von der Automatik ausgeschlossen;
eine automatisch bereitgestellte Verbindung erteilt niemals Schreibrechte
oder eine Änderungsfreigabe.
@@ -186,8 +188,8 @@ nutzen denselben MUA-Endpunkt. Der frühere GraphQL-basierte Unraid-MCP wurde
entfernt und gehört weder zum Start noch zum Recovery.
Der GitHub-Container läuft produktiv. Token-Datei, interner
Streamable-HTTP-Handshake, fehlende Host-Portfreigabe und exakt vier
read-only Werkzeuge wurden am 23. August 2026 verifiziert.
Streamable-HTTP-Handshake, fehlende Host-Portfreigabe und exakt drei
read-only Werkzeuge wurden am 24. August 2026 verifiziert.
Die Transportbrücke verwendet den OpenWebUI-kompatiblen `mcp-proxy` 0.12.0 im
stateless Betrieb. Supergateway wurde nach reproduzierbaren HTTP-400-Fehlern
bei `notifications/initialized` aus diesem Pfad entfernt.
+8 -2
View File
@@ -55,10 +55,13 @@ laufen, sondern alle fachlichen Funktionen geprüft wurden.
- [ ] rohe `qwen-*`-Routermodelle sind ausgeblendet
- [ ] Medium ist die gespeicherte Standardauswahl
- [ ] Filter und Quick Actions sind allen fünf Presets zugeordnet
- [ ] Auto Tool Selector wählt bei harmlosen Testfragen Web, GitHub, Home
- [ ] native OpenWebUI-Websuche funktioniert ohne `web-local`; Auto Tool Selector wählt GitHub, Home
Assistant, ARR, Navidrome, Unraid read-only, Athena-Plattformwissen und
den Athena Operator korrekt
- [ ] normale Unterhaltung erhält kein MCP; MUA wird niemals automatisch gewählt
- [ ] eine synthetische CSV wird lokal ausgewertet; kein Webwerkzeug erhält Dateidaten
- [ ] ein rekursiver GitHub-Komplettbaum ist nicht als Werkzeug verfügbar
- [ ] der zweite identische Werkzeugaufruf wird gestoppt und eine Abschlussantwort erzeugt
- [ ] SearXNG und TinySearch gesund
- [ ] Websuche liefert kompakte, quellengebundene Ergebnisse
@@ -70,11 +73,14 @@ laufen, sondern alle fachlichen Funktionen geprüft wurden.
- [ ] vier ähnliche erfolglose Suchvarianten werden serverseitig gestoppt
- [ ] GitHub- und Hugging-Face-Routing geprüft
- [ ] Home Assistant read-only Diagnose geprüft
- [ ] Home-Assistant-MCP löst `ha.casaderoll.de` im Container auf die private
`HOME_LAN_PROXY_IP` auf und `tools/list` antwortet über WireGuard
- [ ] ARR read-only Suche geprüft
- [ ] Navidrome-MCP gesund; 38 beziehungsweise mit Last.fm 45 Werkzeuge
- [ ] Navidrome-Schemas vollständig llama.cpp-kompatibel
- [ ] Navidrome ist nicht pauschal an jedes Modellprofil gebunden
- [ ] offizieller GitHub-MCP gesund; exakt vier read-only Repository-Werkzeuge
- [ ] offizieller GitHub-MCP gesund; exakt drei read-only Repository-Werkzeuge
- [ ] `dev/verify_mcp_catalogs.sh` endet mit `MCP_CATALOG_SUITE_OK`
- [ ] GitHub-Token liegt nur in `/etc/mike-ai/github-mcp.env` (0600), nicht in OpenWebUI
- [ ] Unraid read-only Diagnose geprüft
- [ ] schreibende Werkzeuge standardmäßig nicht geladen; automatische Auswahl
+4 -1
View File
@@ -6,10 +6,13 @@ Athena startet den offiziellen GitHub MCP grundsätzlich im Nur-Lesen-Modus.
Sichtbar sind exakt:
- `search_repositories`
- `get_repository_tree`
- `get_file_contents`
- `search_code`
`get_repository_tree` ist absichtlich nicht freigeschaltet: rekursive Bäume
können bei Monorepositories den kompletten Werkzeugkontext belegen. Der sichere
Weg ist eine gezielte Codesuche und anschließend das Lesen einzelner Dateien.
Der Token liegt ausschließlich in `/etc/mike-ai/github-mcp.env` (Modus 0600).
Er steht weder in Open WebUI noch in Git, der Dokumentation oder dem Platform
Context MCP. Der Container besitzt keinen Host-Port.
+2 -2
View File
@@ -123,14 +123,14 @@ gestopptes VPN-Gateway lässt KI-Container nicht ins Internet; jeder Profilwechs
startet exakt einen llama-Container; Text, Tool Call, Bild und Sprachausgabe funktionieren.
Nach dem ersten Anlegen des OpenWebUI-Administrators werden Filter, Quick
Actions und die vier Arbeitsbereichsmodelle reproduzierbar eingespielt:
Actions und die fünf Arbeitsbereichsmodelle reproduzierbar eingespielt:
```bash
sudo /opt/mike-ai/stack/platform/openwebui/install-filters.sh
sudo /opt/mike-ai/stack/platform/openwebui/install-models.sh
```
Danach sind nur die vier benannten MikeAI-Presets sichtbar; die rohen
Danach sind nur die fünf benannten MikeAI-Presets sichtbar; die rohen
Router-Aliase sind ausgeblendet und Medium ist die Standardauswahl. Beide
Skripte sichern die OpenWebUI-Datenbank vor jeder Änderung. Der Modellinstaller
synchronisiert außerdem OpenWebUIs persistente OpenAI-kompatible Verbindung mit
+32 -2
View File
@@ -11,7 +11,7 @@ Reihenfolge ist absichtlich festgelegt:
überschreibt den Standard mit Low, Medium oder High.
3. `MikeAI Auto Tool Selector`, Priorität 25: betrachtet ausschließlich die
jüngste Nutzernachricht und stellt pro Anfrage höchstens zwei passende MCPs
bereit. Er erkennt Web, GitHub, Home Assistant, Sonarr/Radarr, Navidrome,
bereit. Er erkennt GitHub, Home Assistant, Sonarr/Radarr, Navidrome,
Unraid-Diagnose und Athena-Plattformwissen. Manuell gewählte Werkzeuge
bleiben erhalten. MUA mit erweiterten Verwaltungsrechten wird nie
automatisch zugeschaltet. Die Auswahl eines MCP ist ausdrücklich keine
@@ -75,7 +75,8 @@ das jeweilige MCP, Bestätigungsregeln und die manuelle MUA-Auswahl begrenzt.
Alle fünf Modelle erhalten außerdem dieselbe Evidenzregel: Aussagen über
aktuelle externe oder Systemzustände benötigen im aktuellen Turn einen
erfolgreichen Aufruf des zuständigen Fachwerkzeugs. Task-Verwaltung zählt nicht
als Datenquelle. Fehlt das Werkzeug oder schlägt es fehl, muss das Modell die
als Datenquelle und wird für einzelne Fragen, Nachschlageaufgaben, Diagnosen
oder Dateiauswertungen nicht verwendet. Fehlt das Werkzeug oder schlägt es fehl, muss das Modell die
fehlende Verifikation offen nennen, statt Werte oder Diagnosen zu erfinden.
Bei mehreren Administratoren muss der gewünschte Eigentümer explizit über
@@ -93,6 +94,35 @@ abgeschnitten. Sind allein die ausgewählten Schemas zu groß, wird der
Werkzeugzugriff nur für diesen Schritt deaktiviert und das Modell erhält eine
eindeutige Abschlussanweisung.
Allgemeine Webrecherche läuft nativ über Open WebUIs `search_web` und
`fetch_url`; der frühere Web-MCP ist nur noch ein manuell gewähltes
Spezialwerkzeug. Pro Antwort sind global höchstens zwölf Werkzeugrunden erlaubt.
Der Stability Guard stoppt den zweiten identischen Aufruf, begrenzt ein Resultat
auf 10.000 und alle Resultate zusammen auf 36.000 Zeichen.
`install-filters.sh` setzt die schlüssellose DuckDuckGo-Suche dabei
reproduzierbar aktiv (fünf Treffer, maximal drei parallele Abrufe).
CSV-, TSV-, Excel- und ODS-Dateien werden ausschließlich lokal verarbeitet.
Die Profile aktivieren dafür den eingebauten Python-Code-Interpreter und die
nativen Dateizugriffswerkzeuge. Tabellen werden nicht als Knowledge/RAG-Text
behandelt; Web- und Web-MCP-Werkzeuge sind für private Tabellendaten gesperrt.
Der Home-Assistant-Relay behält `https://ha.casaderoll.de` als TLS- und
Hostnamen, löst ihn innerhalb des Containers aber über `extra_hosts` auf den
privaten Reverse Proxy `${HOME_LAN_PROXY_IP:-192.168.1.2}` auf. Damit fließt der
MCP-Verkehr über WireGuard ins Heimnetz und nicht über die öffentliche
Fritzbox-Adresse. Bei einer abweichenden Heimserver-IP wird nur
`HOME_LAN_PROXY_IP` in `/etc/mike-ai/stack.env` angepasst.
Nach Installation, Update oder Recovery prüft der rein lesende Katalog-TÜV
alle laufenden MCPs auf Handshake, Werkzeuganzahl, Schema-Größe, ungültige
Regex-Muster und verbotene GitHub-Komplettbäume. Er ruft dabei kein fachliches
Werkzeug auf und liest keine Chats oder Secrets:
```bash
sudo /opt/mike-ai/stack/dev/verify_mcp_catalogs.sh
```
Die rotierende, inhaltsfreie Metrikdatei liegt im persistenten
OpenWebUI-Volume unter `mike-ai-request-metrics.jsonl` (maximal 5 MiB plus eine
Rotation). Sie darf für Benchmarks ausgewertet werden, ohne Chats auszulesen.
+4 -2
View File
@@ -104,13 +104,15 @@ sind ausdrücklich nicht Teil der Architektur. Standard ist read-only; jede
Schreibaktion benötigt eine konkrete Vorschau, eine daran gebundene Freigabe
und eine anschließende Verifikation.
Der offizielle GitHub-MCP bietet nur vier Werkzeuge:
Der offizielle GitHub-MCP bietet nur drei Werkzeuge:
- Repository suchen
- Repositorybaum lesen
- Dateiinhalt lesen
- Code suchen
Rekursive Komplettbäume sind absichtlich ausgeschlossen, weil sie bei großen
Repositories den gesamten Modellkontext verdrängen können.
Andere GitHub-Werkzeuge sowie Schreibzugriffe sind serverseitig deaktiviert.
Für Entwicklung und Betrieb der KI-Plattform existiert ein zentraler Athena
+8 -4
View File
@@ -234,8 +234,8 @@ Netzzugriff. Kein MCP-Port wird am Host veröffentlicht.
|---|---|---|
| Athena-Plattform | Architektur, Quellen, Laufzeitsnapshot, Dokumentationspflege | Lesen; Markdown nur Preview/Approval |
| Athena Operator | vollständige Entwicklung und Betrieb der KI-Plattform | Lesen direkt; Änderungen nur Preview/Ticket/Approval |
| Web | öffentliche Recherche über SearXNG/TinySearch/Crawl4AI sowie strukturierte YouTube-Kanal-, Video- und Transkriptabfragen | read-only; höchstens drei verwandte Aufrufe |
| GitHub | Repositorysuche, Baum, Dateiinhalt, Code-Suche | strikt read-only, vier Tools |
| Web | allgemeine Recherche nativ über Open WebUI; Spezialserver für YouTube und Hugging Face nur bei Bedarf | read-only; höchstens drei verwandte Aufrufe |
| GitHub | Repositorysuche, gezielte Datei- und Code-Suche | strikt read-only, drei Tools |
| Home Assistant | Zustände, Historie, Diagnose, begrenzte YAML-Abläufe | Lesen; Schreiben nur Preview/Approval |
| ARR | Sonarr/Radarr, Indexersuche, kontrollierte Grabs | Lesen; Schreiben nur Preview/Approval |
| Navidrome | Bibliothek, Empfehlungen, Playlists/Favoriten | eigener Benutzer; gezielt aktivieren |
@@ -271,11 +271,15 @@ reinen stdio-zu-Streamable-HTTP-Brücke. Aktiv sind ausschließlich:
```text
search_repositories
get_repository_tree
get_file_contents
search_code
```
Ein rekursiver Komplettbaum ist absichtlich nicht verfügbar. Nutze zunächst
`search_code` und lies danach nur die wirklich benötigten Dateien mit
`get_file_contents`; so darf ein Monorepository nicht den Antwortkontext
verdrängen.
Der GitHub-Token liegt nur in `/etc/mike-ai/github-mcp.env` und nie in Open
WebUI, Git oder einem Prompt. Für Quellcode, README, API-Routen und
Repositorystruktur ist GitHub das richtige Werkzeug; die allgemeine Websuche
@@ -316,7 +320,7 @@ Nur-Lesen zurückkehren. Der Modus darf niemals stillschweigend erweitert werden
Leseaufruf, verweigerter Schreibaufruf, Fehlerfall, Antwortgröße und
Toolschleife.
10. OpenWebUI-Verbindung versioniert installieren. Große Fachwerkzeuge nicht
automatisch an alle Profile hängen; vier kleine, eindeutige Lesetools sind
automatisch an alle Profile hängen; drei kleine, eindeutige GitHub-Lesetools sind
eine bewusst dokumentierte Ausnahme.
11. Recovery-, Komponenten-, Sicherheits- und Betriebsdokumentation ergänzen,
Secret verschlüsselt sichern, Commit und Push durchführen.
+69
View File
@@ -0,0 +1,69 @@
# Werkzeug-Zuverlässigkeit – Umbau vom 24. August 2026
## Anlass
Mehrere reale Aufgaben scheiterten nicht am Qwen-Modell, sondern an der
Werkzeugschicht: öffentliche Suchen lieferten leere oder veraltete Resultate,
ein rekursiver GitHub-Baum verdrängte die Antwort aus dem Kontext, eine private
Bank-CSV wurde als Knowledge-Quelle statt als Tabelle behandelt und ein nicht
erreichbarer Home-Assistant-Endpunkt provozierte Wiederholungen. Das System
benötigte deshalb kleinere, klarere Werkzeuge und harte Abbruchgrenzen.
## Verbindliche Lösung
1. Allgemeine öffentliche Recherche verwendet Open WebUIs native
`search_web`- und `fetch_url`-Werkzeuge. Der eigene Web-MCP bleibt nur als
manuell zugeschalteter Spezialadapter für YouTube und Hugging Face.
2. Der offizielle GitHub-MCP bietet genau drei read-only Werkzeuge:
`search_repositories`, `search_code` und `get_file_contents`. Rekursive
Komplettbäume sind ausgeschlossen.
3. Private CSV-/Excel-Dateien werden ausschließlich mit dem lokalen
Code-Interpreter und pandas/openpyxl ausgewertet. Web, MCP und Knowledge/RAG
erhalten keine Dateiinhalte oder daraus abgeleitete Suchbegriffe. Der Filter
leert dafür die MCP-Auswahl und deaktiviert `features.web_search`; im
installierten OpenWebUI-Code läuft der Filter nachweislich vor der
Webwerkzeug-Injektion.
4. Pro Antwort sind höchstens zwölf Werkzeugrunden erlaubt. Der zweite
identische Aufruf wird gestoppt. Ein einzelnes Resultat ist auf 10.000, alle
Resultate zusammen auf 36.000 Zeichen begrenzt.
5. Der Home-Assistant-MCP behält den TLS-Namen `ha.casaderoll.de`, routet ihn
im Container aber auf `HOME_LAN_PROXY_IP` im Heimnetz. Dadurch funktioniert
er auch vom Außenstandort über WireGuard.
6. Task-Management ist keine Faktenquelle und wird nicht für einzelne Fragen,
Nachschlageaufgaben oder Dateianalysen verwendet.
## Abnahme
- OpenWebUI-Filtertests: 28
- Web-MCP-Tests: 9
- Athena-Operator-Sicherheitstests: 11
- Platform-Context-Test: bestanden
- MCP-Katalog-TÜV: Handshake, Toolanzahl, Schema-Größe, Regex-Muster und
verbotene Tools; keinerlei fachliche Toolaufrufe
- Gesamttest des Routers: Profile, Streaming, Tools, Bild, Sprache und
Fehlerwiederherstellung
Der wiederholbare MCP-Test lautet:
```bash
sudo /opt/mike-ai/stack/dev/verify_mcp_catalogs.sh
```
Er muss mit `MCP_CATALOG_SUITE_OK` enden.
## Noch manuell zu prüfen
Ein echter Browsertest mit einer bewusst synthetischen CSV benötigt eine
angemeldete OpenWebUI-Sitzung. Nach Login wird eine harmlose Beispieltabelle
hochgeladen und geprüft, dass die Antwort sichtbare Summen enthält und in der
Werkzeuganzeige ausschließlich lokale Datei-/Codewerkzeuge erscheinen. Für
diesen Test dürfen niemals echte Bankdaten verwendet werden.
## Rollback
Vor dem Live-Umbau liegt die Quell- und Konfigurationssicherung unter
`/data/mike-ai-recovery/pre-tooling-upgrade-20260823-235527`. OpenWebUIs
Datenbank wurde zusätzlich unmittelbar vor Filter- und Modellinstallation
gesichert. Ein Rollback betrifft ausschließlich Werkzeug-/OpenWebUI-Dateien;
Netzwerk, SSH, WireGuard, Kernel, GPU-Treiber und Bootkonfiguration wurden nicht
verändert.