MCP-Client fuer HTTP-Server: externe Werkzeuge durch dieselben Pruefstellen (#197)

- Core/Mcp/McpClient: Streamable HTTP (MCP 2025-06-18) - initialize, tools/list
  with paging, tools/call; answers as JSON or event stream; session kept and
  opened again when the server forgets it; answers capped at 4 MB.
- McpServerTool: one server is one tool (mcp_<id>); its remote tools are the
  operations, so rights, preflight, staging, lead approvals, votes, audit and
  budget apply. On approval by default unless the human trusts an operation;
  reads foreign content; the server's descriptions are cut short and marked.
- McpConnections: registers, refreshes every 15 minutes, follows changes.
- InstanceConfig.mcpServers with protected headers; /api/mcp-servers;
  settings card "External MCP servers"; tool catalog includes the servers.
- stdio servers are not part of this (sandbox runner, separate step).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-10-01 18:15:44 +02:00
co-authored by Claude Opus 5.5
parent 44844a41a0
commit caf4323012
19 changed files with 1089 additions and 5 deletions
@@ -1100,6 +1100,28 @@
"mcp.copy": "Kopieren",
"mcp.copied": "Kopiert.",
"mcp.copyFailed": "Kopieren ist hier nicht erlaubt — Text markieren und von Hand kopieren.",
"mcpServers.title": "Externe MCP-Server",
"mcpServers.hint": "Jeder Server wird ein Werkzeug (mcp_<id>), das du Agenten wie jedes andere gibst — etwa die Workflows, die du in n8n freigegeben hast. Jeder Aufruf läuft durch Werkzeugrechte, Freigaben und Audit und steht auf Freigabe, solange du die Operation unten nicht als vertraut einträgst. Ergebnisse und Beschreibungen sind Fremdinhalt. Kopfzeilenwerte werden geschützt gespeichert und nie angezeigt.",
"mcpServers.none": "Kein externer MCP-Server.",
"mcpServers.add": "Server hinzufügen",
"mcpServers.id": "ID (ergibt den Werkzeugnamen)",
"mcpServers.name": "Name",
"mcpServers.url": "Adresse (Streamable HTTP)",
"mcpServers.token": "Bearer-Token (optional)",
"mcpServers.tokenPlaceholder": "wird geschützt gespeichert",
"mcpServers.trusted": "Ohne Freigabe",
"mcpServers.trustedPlaceholder": "eine Operation je Zeile",
"mcpServers.header": "Kopfzeile setzen",
"mcpServers.headerValue": "Wert — leer entfernt sie",
"mcpServers.headers": "Kopfzeilen: {names}",
"mcpServers.toolsCount": "{n} Werkzeug(e)",
"mcpServers.unreachable": "nicht erreichbar",
"mcpServers.off": "aus",
"mcpServers.refreshed": "Werkzeuge vom {time}",
"mcpServers.refresh": "Aktualisieren",
"mcpServers.disable": "Ausschalten",
"mcpServers.enable": "Einschalten",
"mcpServers.remove": "Entfernen",
"trigger.title": "Eingehende Auslöser (n8n und andere)",
"trigger.hint": "Etwas von außen startet Arbeit für diesen Agenten: ein n8n-Workflow auf eine Mail, einen Zeitplan oder ein Formular — oder jedes System, das eine HTTP-Anfrage schickt. Jede Lieferung wird eine Aufgabe für diesen Agenten; ihr Inhalt ist Fremdinhalt, nie Anweisung. Ein Token je Auslöser, mit Obergrenze je Stunde.",
"trigger.labelPlaceholder": "z. B. n8n neue Bestellungen",