docs(rfc): MCP-Server nur im Backend, kein Node als Laufzeit — dritte Runde; Hausregel: neue Technologie braucht ausdrückliche Zustimmung
Nutzer-FYI: Node.js einzuführen ist eine Dimension schwerer als eine Backend-Abhängigkeit und muss dem Entwickler deutlich gemacht werden — als Regel in CLAUDE.md. Aus den nachgefragten Beweggründen folgt: kein lokaler Prozess. Der MCP-Server lebt im Backend (Streamable HTTP, Bearer-Token), führt die Frontend-Module per GraalJS aus, jedes Werkzeug hat eine text- und eine document-Form; das Node-Paket ist verworfen, seine Tool-Schicht lebt als frontend/src/inspect.js, guard.js, edit.js. Backend-Abhängigkeiten GraalJS + Spring-AI-Starter zugestimmt; der GraalJS-Spike steht vor allem anderen. RFC neu geschrieben (§12 hält die drei Runden fest), Plan-Teilbaum #ai.mcp neu, D93-Nachtrag. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
62807b91a1
commit
1f186eddce
+54
-2
@@ -8765,6 +8765,58 @@ auch wenn sie erst spät gebaut werden — RFC §5.7 und §5.10):
|
||||
keinen Git-Spiegel; eine echte Teilmenge der lokalen Fassung mit
|
||||
denselben Verben.
|
||||
|
||||
Offen bleiben nur noch Messungen (GraalJS-Spike, SSE durch den Apache)
|
||||
und die Prompts. Die Umsetzungsreihenfolge steht im RFC; gebaut ist nichts.
|
||||
**Dritte Runde — Node ist eine Technologie, keine Abhängigkeit; der
|
||||
Entwurf kippt (2026-09-02, später am Tag).** Nutzer-FYI, als wichtig
|
||||
notiert: *„Bevor komplette neue Technologien eingeführt werden, hier z. B.
|
||||
Node.js, sollte dies dem menschlichen Entwickler deutlich gemacht werden
|
||||
und dessen Zustimmung eingeholt werden. Node.js einzuführen ist eine
|
||||
Dimension schlimmer als eine neue Dependency für den Kotlin/Spring-Boot
|
||||
Backend."* Das RFC hatte Node — bisher im Repo reines Build-Werkzeug
|
||||
(Vite) — als **Laufzeit** vorgeschlagen, lokal als Paket und auf dem
|
||||
Server als Dienst, und dabei nur die SDK-Abhängigkeit abgefragt; die
|
||||
eigentliche Frage war nie sichtbar gestellt. Die Regel steht jetzt in
|
||||
CLAUDE.md (Querschnitts-Konventionen): Eine neue Laufzeit oder Sprache wird
|
||||
als eigene, benannte Entscheidung mit den Alternativen innerhalb der
|
||||
vorhandenen Technologien vorgelegt — nie als Nebensatz.
|
||||
|
||||
Nachgeholt in zwei Schritten — erst die **Beweggründe** (Nutzer: „die
|
||||
Frage aufsplitten und mich mehr nach Beweggründen fragen, daraus die
|
||||
eigentliche Entscheidung ableiten"), dann die Entscheidung:
|
||||
|
||||
- **Beweggründe:** Entwickler arbeiten parallel an geteilten Plänen und
|
||||
setzen agentische KI ein — Pläne im Dialog erstellen, Feature-Fortschritt
|
||||
tracken; der Agent läuft meist lokal (OpenCode, Claude Code, Codex),
|
||||
später auch im Frontend. Pläne liegen **beides**: als Datei im Repo und
|
||||
als Server-Dokument. Der Text eines lokalen Plans **darf** zur Analyse
|
||||
an den eigenen Server. Die Startzeit eines lokalen Prozesses ist egal.
|
||||
- **Daraus folgt: kein lokaler Prozess, keine neue Laufzeit.** Der
|
||||
MCP-Server lebt **nur im Backend** (Streamable HTTP, Bearer-Token per
|
||||
Spring Security), die Werkbaum-Logik läuft dort per GraalJS aus den
|
||||
unveränderten Frontend-Modulen, beim Bauen zu einem ES-Modul gebündelt —
|
||||
Node bleibt Build-Werkzeug. Jedes Werkzeug hat zwei Formen: `text` (der
|
||||
Agent hat die Datei selbst gelesen, bekommt den neuen Text zurück und
|
||||
schreibt ihn selbst; die Leitplanken sind dort **Befund**) und `document`
|
||||
(UUID eines Dokuments dieses Backends; Zeilen-Diff, Konfliktschutz,
|
||||
Leitplanken als **Sperre**). `document` ist bewusst eine UUID, keine URL
|
||||
— kein Fremdserver, keine SSRF-Frage. Der Git-Spiegel ist `pull-doc`,
|
||||
vom Cron oder vom Agenten selbst aufgerufen; ein Spiegel am Dienst
|
||||
entfällt.
|
||||
- **Verworfen:** das Node-Paket (`#ai.mcp.node` `[-]`); als Rückfall
|
||||
benannt, nicht gewählt: das Backend-Jar im stdio-Modus beim Entwickler
|
||||
(keine neue Laufzeit, aber ohne Anlass, sobald der Text zum Server darf).
|
||||
- **Backend-Abhängigkeiten, Rückfrage gestellt und beantwortet:** GraalJS
|
||||
(`org.graalvm.polyglot`) und der **Spring-AI-Starter**
|
||||
(`spring-ai-starter-mcp-server-webmvc`); Boot-4-Verträglichkeit ist beim
|
||||
Spike zu prüfen, Rückfall das MCP-Java-SDK direkt.
|
||||
- **Die Runde-1-Entscheidungen zum Node-Paket sind überholt** (SDK,
|
||||
Serialisierung im Paket, npm); die Tool-Schicht lebt als
|
||||
`frontend/src/inspect.js`, `guard.js`, `edit.js` — dort, wo `#ai.dialog`
|
||||
sie ohnehin braucht.
|
||||
|
||||
**Vor allem anderen steht jetzt der Spike** (`#ai.mcp.spike`): Läuft das
|
||||
Bündel in GraalJS mit denselben Zahlen wie Vitest, was kostet ein Kontext
|
||||
auf dem knappen Host (D76-Nachtrag 3), reicht der Apache den SSE-Strom
|
||||
ungepuffert durch. Fällt er durch, ist die Antwort nicht Node, sondern eine
|
||||
neue Frage an den Entwickler. Offen sonst nur die Prompts. Gebaut ist
|
||||
nichts.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user