feat: open Athena tool architecture
This commit is contained in:
+25
-26
@@ -11,8 +11,9 @@ Prompts heraus, verhindert den früher beobachteten Kontextverbrauch von über
|
||||
| Container | Endpunkt im Netz `mike-ai-tools` | Zweck | Standard |
|
||||
|---|---|---|---|
|
||||
| `mcp-platform-context` | `http://mike-ai-mcp-platform-context:8000/mcp` | Athena-Wissen, begrenzter Snapshot und kontrollierte Docs-Pflege | an |
|
||||
| `mcp-athena-operator` | `http://mike-ai-mcp-athena-operator:8000/mcp` | vollständiger Betrieb der Athena-KI-Plattform über Vorschau/Freigabe | an |
|
||||
| `mcp-web` | `http://mike-ai-mcp-web:8000/mcp` | kompakte Websuche und Quellenvergleich | an |
|
||||
| `mcp-athena-operator` | `http://mike-ai-mcp-athena-operator:8000/mcp` | vollständiger Betrieb plus breites begrenztes Terminal | an |
|
||||
| `tinysearch` | `http://tinysearch:8000/mcp` | allgemeine portable Websuche und Seitenabruf | an |
|
||||
| `mcp-web` | `http://mike-ai-mcp-web:8000/mcp` | frühere spezialisierte Web-Fassade | nur Profil `legacy-web` |
|
||||
| `mcp-homeassistant` | `http://mike-ai-mcp-homeassistant:8000/mcp` | Relay zum nativen HA-MCP; Token bleibt serverseitig | Profil `homeassistant` |
|
||||
| `mcp-arr` | `http://mike-ai-mcp-arr:8000/mcp` | Sonarr/Radarr/Prowlarr mit serverseitiger Policy | Profil `arr` |
|
||||
| `mcp-navidrome` | `http://mike-ai-mcp-navidrome:3000/mcp` | Navidrome-Bibliothek, Suche, Playlists, Favoriten und Hörverlauf | Profil `navidrome` |
|
||||
@@ -39,15 +40,14 @@ Preview/Approval-Ablauf begrenzt. Vollständige Beschreibung:
|
||||
[`docs/PLATFORM_CONTEXT_MCP.md`](../../docs/PLATFORM_CONTEXT_MCP.md).
|
||||
|
||||
Der Athena Operator MCP ist die einzige Bedienebene für Arbeiten an der lokalen
|
||||
KI-Plattform. Qwen kann damit Quellen lesen, Änderungen vorbereiten, MCPs und
|
||||
Docker-Dienste bauen/deployen, Modelle laden, Benchmarks starten, Profile und
|
||||
OpenWebUI pflegen, Git veröffentlichen und Recovery erzeugen. Die unprivilegierte
|
||||
MCP-Fassade sieht dabei nur einen lokalen Unix-Socket. Docker-Socket,
|
||||
Repository, Modellverzeichnis, Git-Zugang und Root-Rechte verbleiben im
|
||||
rootseitigen Executor. Jede Änderung benötigt eine vollständige Vorschau, ein
|
||||
inhaltlich gebundenes, ablaufendes Ticket und eine spätere exakte Bestätigung.
|
||||
Eine freie Shell sowie SSH-, Netzwerk-, Boot-, Kernel-, Treiber-, Partitions-,
|
||||
Reboot- und Shutdown-Aktionen werden nicht angeboten.
|
||||
KI-Plattform. Qwen kann damit Quellen lesen, strukturierte Änderungen
|
||||
vorbereiten, MCPs und Docker-Dienste bauen/deployen, Modelle laden, Benchmarks
|
||||
starten, Profile und OpenWebUI pflegen, Git veröffentlichen und Recovery
|
||||
erzeugen. Zusätzlich bietet er ein breites, ausgabebegrenztes Terminal für
|
||||
unvorhergesehene Docker-, Datei-, Git-, HTTP-, Modell- und Remote-SSH-Aufgaben.
|
||||
Die MCP-Fassade sieht nur einen lokalen Unix-Socket; Root-Rechte verbleiben im
|
||||
Executor. Strombefehle und Änderungen an Athenas SSH, LAN, WireGuard, Firewall,
|
||||
Boot, Kernel, Mounts und Partitionen werden serverseitig blockiert.
|
||||
|
||||
Für Git-Publishing besitzt Athena ein eigenes Schlüsselpaar unter
|
||||
`/etc/mike-ai/athena-operator-git{,.pub}`. Nur der öffentliche Schlüssel wird
|
||||
@@ -64,14 +64,13 @@ TinySearch bleibt als Ganzes read-only. Nur das flüchtige tmpfs-Verzeichnis
|
||||
temporären Browser- und Sitzungszustand erzeugt. Es wird bei jedem
|
||||
Container-Neustart vollständig verworfen.
|
||||
|
||||
TinySearch und SearXNG sind interne Abhängigkeiten des Web-MCPs und werden
|
||||
nicht direkt als allgemeine Werkzeuge angeboten.
|
||||
TinySearch ist der allgemeine portable Web-MCP. Auf VPN-Port 8203 können Hermes,
|
||||
Pi und andere Clients seine vier Upstream-Werkzeuge direkt nutzen. SearXNG ist
|
||||
der Such-Backenddienst. Die historische eigene Web-Fassade ist nur Rollback.
|
||||
|
||||
Die fünf Open-WebUI-Profile Fast, Medium, Large, Ultra und Uncensored verwenden
|
||||
für allgemeine öffentliche Recherche Open WebUIs native Werkzeuge `search_web`
|
||||
und `fetch_url`. Der Server `server:mcp:web-local` bleibt als manuell
|
||||
zuschaltbarer Spezialkatalog für gezielte YouTube- und Hugging-Face-Abfragen
|
||||
erhalten. Er wird nicht mehr automatisch an öffentliche Fragen gebunden.
|
||||
Die fünf Open-WebUI-Profile Fast, Medium, Large, Ultra und Uncensored halten für
|
||||
allgemeine öffentliche Recherche Open WebUIs native Werkzeuge `search_web` und
|
||||
`fetch_url` verfügbar. Neue Websites benötigen keine neue Selector-Regel.
|
||||
|
||||
Ein gemeinsamer Systemhinweis der fünf Profile verlangt Webprüfung bei
|
||||
aktuellen, veränderlichen oder wesentlich unsicheren Tatsachen. Stabiles
|
||||
@@ -82,9 +81,9 @@ vertrauenswürdige Daten statt als Anweisungen.
|
||||
|
||||
## Entscheidungshilfe für das Modell
|
||||
|
||||
Die Server- und Werkzeugbeschreibungen grenzen die Zuständigkeiten absichtlich
|
||||
deutlich voneinander ab. Das Modell soll pro Aufgabe zunächst genau **einen**
|
||||
passenden Server wählen:
|
||||
Die Server- und Werkzeugbeschreibungen grenzen die Zuständigkeiten voneinander
|
||||
ab. Das Modell beginnt mit den breitesten geeigneten Grundfähigkeiten und nutzt
|
||||
Fach-MCPs dort, wo strukturierte Daten oder Aktionen benötigt werden:
|
||||
|
||||
| Aufgabe | Werkzeugserver | Nicht zusätzlich verwenden |
|
||||
|---|---|---|
|
||||
@@ -113,8 +112,8 @@ oder ein anderes Werkzeug benötigt wird.
|
||||
- Jeder Container ist read-only, verliert Linux-Capabilities und hat
|
||||
`no-new-privileges`.
|
||||
- Der SSH-basierte Unraid-Container ist nicht Teil des Standardstarts.
|
||||
- Ein allgemeiner Host-Shell-MCP wird weiterhin bewusst nicht angeboten. Der
|
||||
Athena Operator besitzt strukturierte Plattformaktionen statt freier Befehle.
|
||||
- Das allgemeine Terminal ist Bestandteil des Athena Operators auf Port 8202;
|
||||
ein zweiter Shell-MCP ist nicht erforderlich.
|
||||
|
||||
## Start
|
||||
|
||||
@@ -122,12 +121,12 @@ oder ein anderes Werkzeug benötigt wird.
|
||||
sudo platform/mcp/install-tools.sh
|
||||
```
|
||||
|
||||
Der Grundstart enthält Plattformwissen, den kontrollierten Athena Operator und
|
||||
den Web-Spezialadapter. Bereits konfigurierte Fachbereiche werden explizit
|
||||
Der Grundstart enthält Plattformwissen, den Athena Operator und das allgemeine
|
||||
TinySearch-Webwerkzeug. Bereits konfigurierte Fachbereiche werden explizit
|
||||
ergänzt:
|
||||
|
||||
Das Skript erkennt vorhandene Secret-Dateien und aktiviert dadurch automatisch
|
||||
`homeassistant`, `arr` und `unraid`. Ohne Fach-Secrets bleiben nur die drei
|
||||
`homeassistant`, `arr`, `navidrome` und `github`. Ohne Fach-Secrets bleiben die
|
||||
secretfreien Grunddienste aktiv.
|
||||
|
||||
Für den derzeit migrierten Container kann der Name `Open-WebUI` lauten. Der
|
||||
|
||||
@@ -10,7 +10,7 @@ import sys
|
||||
from typing import Any
|
||||
|
||||
|
||||
VERSION = "1.0.0"
|
||||
VERSION = "2.0.0"
|
||||
SOCKET_PATH = os.environ.get("ATHENA_OPERATOR_SOCKET", "/operator/operator.sock")
|
||||
|
||||
if hasattr(sys.stdin, "reconfigure"):
|
||||
@@ -54,6 +54,29 @@ TOOLS = [
|
||||
"description": "Search the complete versioned Athena repository for exact text before designing or modifying a component.",
|
||||
"inputSchema": {"type": "object", "properties": {"query": {"type": "string", "minLength": 1, "maxLength": 200}}, "required": ["query"], "additionalProperties": False},
|
||||
},
|
||||
{
|
||||
"name": "athena_operator_terminal",
|
||||
"description": (
|
||||
"GENERAL ATHENA TERMINAL. Run one bounded shell command on the Athena host when the "
|
||||
"structured operator tools are too narrow. This is the broad escape hatch for Docker, "
|
||||
"Compose, Git, MCP development, model inspection, downloads, HTTP/API tests, files, logs "
|
||||
"and SSH to configured remote systems. Prefer a single focused command and cap noisy output "
|
||||
"with the command itself. The server blocks power control and changes to Athena's SSH, LAN, "
|
||||
"WireGuard, firewall, boot, kernel, mounts and partitions so remote reachability cannot be "
|
||||
"accidentally destroyed. Other commands execute immediately and must be verified afterwards."
|
||||
),
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"command": {"type": "string", "minLength": 1, "maxLength": 8000},
|
||||
"cwd": {"type": "string", "maxLength": 500, "default": "/opt/mike-ai/stack"},
|
||||
"timeout_seconds": {"type": "integer", "minimum": 1, "maximum": 3600, "default": 300},
|
||||
"max_output_chars": {"type": "integer", "minimum": 1000, "maximum": 30000, "default": 12000},
|
||||
},
|
||||
"required": ["command"],
|
||||
"additionalProperties": False,
|
||||
},
|
||||
},
|
||||
{
|
||||
"name": "athena_operator_prepare",
|
||||
"description": (
|
||||
@@ -129,6 +152,7 @@ def call(name: str, arguments: dict[str, Any]) -> dict[str, Any]:
|
||||
"athena_operator_inspect": "inspect",
|
||||
"athena_operator_read_source": "read_source",
|
||||
"athena_operator_search_source": "search_source",
|
||||
"athena_operator_terminal": "terminal",
|
||||
"athena_operator_prepare": "prepare",
|
||||
"athena_operator_execute": "execute",
|
||||
"athena_operator_job": "job",
|
||||
|
||||
@@ -16,6 +16,9 @@ x-tool-common: &tool-common
|
||||
services:
|
||||
mcp-web:
|
||||
<<: *tool-common
|
||||
# Historical site-specific facade. Kept only for rollback while the
|
||||
# default portable endpoint points directly at TinySearch's broad MCP.
|
||||
profiles: [legacy-web]
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: mcp/Dockerfile.web
|
||||
@@ -186,7 +189,7 @@ services:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.athena-operator
|
||||
image: mike-ai/mcp-athena-operator:1.0.0
|
||||
image: mike-ai/mcp-athena-operator:2.0.0
|
||||
container_name: mike-ai-mcp-athena-operator
|
||||
environment:
|
||||
ATHENA_OPERATOR_SOCKET: /operator/operator.sock
|
||||
|
||||
Reference in New Issue
Block a user