MCP-Zugang (SpeamCore als MCP-Server)
Dieser Artikel erklärt, wie SpeamCore sich selbst als MCP-Server (Model Context Protocol) bereitstellt, sodass externe KI-Assistenten — z. B. Claude (Custom Connector) oder ChatGPT — direkt auf SpeamCore zugreifen können. Die operative Verwaltung der Zugangs-Tokens beschreibt die Seite MCP-Zugang — Einstellungen.
Abgrenzung
SpeamCore nutzt MCP an zwei Stellen — wichtig, beide nicht zu verwechseln:
- Intern: Der eingebaute KI-Chat verwendet dieselben MCP-Tools lokal.
- Extern (dieser Artikel): Ein außenstehender Assistent (Claude/ChatGPT) verbindet sich über das Netz mit SpeamCore und ruft dieselben Werkzeuge auf.
Das Problem
Anwender wollen SpeamCore nicht nur über die eigene Oberfläche bedienen, sondern aus ihrem KI-Assistenten heraus („Lege in SpeamCore ein Angebot für Kunde X an"). Dafür muss SpeamCore von außen erreichbar sein — kontrolliert, authentifiziert und auf die Rechte des Nutzers begrenzt.
Lösung — ein MCP-Endpunkt mit zwei Auth-Wegen
Der MCP-Server läuft als eigener HTTP-Transport (Standard-Port 4001, env MCP_PORT) neben der normalen API; ein Proxy leitet POST /mcp dorthin. Er ist stateless (keine Session-Bindung), damit Anfragen über mehrere Server-Instanzen hinweg funktionieren.
Die zwei Authentifizierungswege
1. Bearer-Token (statisch) — für ChatGPT & headless
Ein im System erzeugtes MCP-Access-Token (Format mcp_…) wird als Authorization: Bearer … mitgeschickt. Dieser Weg gewährt ROOT-Vollzugriff (alle Rechte). Das Token wird nur als SHA-256-Hash gespeichert und erscheint genau einmal bei der Erzeugung. Verwaltung: MCP-Zugang — Einstellungen.
2. OAuth via Keycloak — für Claude Custom Connector
Claude meldet sich über OAuth 2.0 an (RFC 9728, „Protected Resource"). SpeamCore veröffentlicht dazu öffentlich die Metadaten unter /.well-known/oauth-protected-resource; der Login läuft gegen den Keycloak-Realm. Anschließend wirkt der Zugriff mit den Rechten des angemeldeten Nutzers — nicht ROOT. Die Rollen werden dabei aus dem Keycloak-userinfo-Endpunkt aufgelöst (die APP_SPEAMCORE_*-Rollen sind zu groß für das Access-Token).
| Weg | Identität | Rechte | Typischer Einsatz |
|---|---|---|---|
| Bearer-Token | das Token | ROOT (alles) | ChatGPT, Automatisierung, Headless |
| Keycloak-OAuth | angemeldeter Nutzer | dessen Rolle | Claude Custom Connector |
Was ein externer Assistent tun kann
Über MCP stehen dieselben Werkzeuge zur Verfügung wie im internen KI-Chat (rund 80 Tools — Angebote/Aufträge anlegen, Abwesenheiten, Berechnungen u. v. m.). Jeder Tool-Aufruf wird CASL-geprüft: Beim Keycloak-Weg gegen die Nutzer-Rolle, beim Bearer-Token gegen die ROOT-Ability. Es gibt keine Abkürzung an den Geschäftsregeln vorbei — alles läuft durch dieselbe Service-Schicht wie die REST-API.
Sicherheit
Zusätzlicher Schutz: Über die Umgebungsvariable MCP_ALLOWED_HOSTS wird DNS-Rebinding abgewehrt.
Architektur / Komponenten
Backend
- MCP-Server (
@modelcontextprotocol/sdk) auf Port4001, EndpunktPOST /mcp, stateless. - Auth-Gateway (
mcpAuthMiddleware): unterscheidetmcp_-Bearer-Token von Keycloak-JWT. - Modell
mcpAccessToken(Hash, Prefix, Ablauf, Widerruf) + Endpoints/mcp-access-tokens(CASLMcpAccessToken). - OAuth-Metadaten unter
/.well-known/oauth-protected-resource.
Frontend
- Seite /settings/mcp-tokens — Token-Verwaltung + Setup-Anleitung für Claude/ChatGPT.
Anti-Pattern (was NICHT machen)
- ❌ Ein Bearer-Token ohne Ablauf oder dauerhaft in einem Skript hinterlegen.
- ❌ Ein ROOT-Token weitergeben, wenn der nutzergebundene Keycloak-Weg reicht.
- ❌ Den MCP-Port
4001direkt ins Internet stellen, ohne Proxy +MCP_ALLOWED_HOSTS.
Verwandte Doku
- MCP-Zugang — Einstellungen — Tokens anlegen/widerrufen + Setup-Guide.
- KI-Chat-Architektur — die internen MCP-Tools.
- Berechtigungen verstehen (CASL).