Repository navigation
MCP mit SSO einrichten
Diese Anleitung verbindet einen MCP-Client — Claude Code, VS Code oder ein Konfigurationsdialog wie Keyzapper — per Single Sign-on mit Weave. Danach sucht der Client mit dem Konto des angemeldeten Nutzers: Er sieht genau die Wissensbereiche, die diese Person auch im Portal sieht, nicht mehr.
Die maßgebliche Fassung mit allen Hintergründen ist docs/integrations/vscode-mcp-sso.md. Diese Seite ist die Schritt-für-Schritt-Fassung für Entra ID. Für Keycloak gelten dieselben Schritte sinngemäß; die Unterschiede stehen in der Doku.
- Der Client ruft
https://<weave-host>/mcpohne Token auf und bekommt401mit einem Verweis auf die Discovery-Adresse. - Unter
/.well-known/oauth-protected-resource/mcperfährt er, bei welchem Identity Provider er sich anmelden muss und welchen Scope er braucht. - Er öffnet den Browser-Login bei Entra (Authorization Code mit PKCE) und erhält ein Access Token für die Weave-MCP-API.
- Weave prüft Signatur, Issuer, Audience und Scope und ordnet das Token über
die Entra-Objekt-ID (
oid) einem vorhandenen Weave-Nutzer zu.
Weave legt dabei keine Nutzer an und übernimmt keine Rechte aus dem Token. Wer im Portal nicht existiert oder deaktiviert ist, bekommt auch per MCP keinen Zugriff.
| Rolle | Teil |
|---|---|
| Entra-Administrator | Teil 1 |
| Betreiber von Weave | Teil 2 und Teil 3 |
| Jeder Nutzer | Teil 4 und Teil 5 |
Diese fünf Werte tauchen in allen Teilen wieder auf. Am besten einmal notieren und dann nur noch einsetzen.
| Platzhalter | Woher | Beispiel |
|---|---|---|
<tenant-id> |
Entra → Übersicht → Mandanten-ID | 00000000-… |
<api-client-id> |
Application (client) ID der API-App aus Schritt 1 | 11111111-… |
<public-client-id> |
Application (client) ID der Client-App aus Schritt 5 | 22222222-… |
<weave-host> |
Öffentlicher Hostname, unter dem /mcp erreichbar ist |
weave.example.org |
<port> |
Frei wählbarer lokaler Port für den Login-Rückruf | 8976 |
Client-IDs sind keine Geheimnisse. Ein Client-Secret wird an keiner Stelle gebraucht und darf auch nicht verteilt werden.
Es werden zwei App-Registrierungen gebraucht: eine für die Weave-MCP-API (die Ressource) und eine für die MCP-Clients (den Aufrufer). Die App-Registrierung, mit der sich das Portal anmeldet, ist keine von beiden.
Schritt 1 — App registrieren. Entra → App registrations → New
registration. Name zum Beispiel weave-mcp-api, nur Konten dieses
Verzeichnisses, keine Redirect-URI. Die Application (client) ID ist
<api-client-id>.
Schritt 2 — Application ID URI setzen. Expose an API → Application ID URI
→ Add. Den Vorschlag api://<api-client-id> übernehmen.
Häufiger Fehler: Hier gehört kein Scope-Name hinein. Steht dort
api://<api-client-id>/mcp.read, heißt der Scope später…/mcp.read/mcp.read. Die Vorschau unter dem Feld „Scope name“ zeigt das.
Schritt 3 — Scope anlegen. Expose an API → Add a scope:
| Feld | Wert |
|---|---|
| Scope name | mcp.read |
| Who can consent |
Admins only (Zustimmung dann in Schritt 7) |
| Admin consent display name | Weave über MCP lesen |
| Admin consent description | Erlaubt der App, im Namen des angemeldeten Nutzers über MCP in Weave zu suchen und freigegebenes Wissen zu lesen. |
| State | Enabled |
Die Vorschau zeigt jetzt api://<api-client-id>/mcp.read.
Schritt 4 — Token-Version 2 erzwingen. Manifest →
requestedAccessTokenVersion auf 2 setzen (im neuen Manifest-Editor unter
api), speichern.
Ohne diese Einstellung stellt Entra v1-Tokens mit dem Issuer
https://sts.windows.net/<tenant-id>/aus. Weave erwartet den v2-Issuer und weist jedes Token ab — der Login klappt, der Zugriff nicht.
Schritt 5 — App registrieren. New registration, Name zum Beispiel
weave-mcp-client, nur Konten dieses Verzeichnisses. Die Application (client)
ID ist <public-client-id>.
Schritt 6 — Redirect-URI und öffentlichen Client einrichten. Authentication → Add a platform → Mobile and desktop applications:
- Für Claude Code:
http://localhost:<port>/callback - Für VS Code zusätzlich
http://127.0.0.1:33418und, falls im Browser genutzt,https://vscode.dev/redirect(dafür Plattform „Web“)
Darunter Allow public client flows auf Yes stellen. Kein Client-Secret
anlegen.
Schritt 7 — Berechtigung erteilen. API permissions → Add a permission →
My APIs → weave-mcp-api → Delegated → mcp.read → Add. Danach
Grant admin consent for … klicken. Der Status muss grün „Granted“ zeigen.
Schritt 8 — Anmeldeverfahren im Portal prüfen. Das Portal muss bereits
über Entra (gleicher Tenant) anmelden. Den Slug dieses Anbieters aus der
Administration notieren, er wird gleich als MCP_OAUTH_PROVIDER_SLUG gebraucht.
Schritt 9 — Werte in weave.yaml setzen. Unter
services.tools.settings und services.ingest.settings jeweils value
eintragen:
# Tools
MCP_OAUTH_ISSUER = https://login.microsoftonline.com/<tenant-id>/v2.0
MCP_OAUTH_RESOURCE_URL = https://<weave-host>/mcp
MCP_OAUTH_SCOPES = ["api://<api-client-id>/mcp.read"]
# Ingest
MCP_OAUTH_PROVIDER_SLUG = <slug aus Schritt 8>
MCP_OAUTH_AUDIENCE = <api-client-id>
MCP_OAUTH_SUBJECT_CLAIM = oid
MCP_OAUTH_REQUIRED_SCOPES = ["mcp.read"]
- Der Issuer ist tenant-spezifisch, nie
commonoderorganizations. -
MCP_OAUTH_AUDIENCEist die nackte GUID der API-App, ohneapi://. -
TOOLS_INTROSPECTION_TOKENmuss in Ingest und Tools identisch sein; das erledigtweave_config.py rendervon selbst.
Für Helm werden die Werte mit python scripts/weave_config.py helm-values
nach config.tools und config.ingest übertragen.
Schritt 10 — Ingress freischalten. Im Helm-Chart ingress.toolsMcp
einschalten. Ob ein eigener Host oder der Portal-Host — entscheidend ist, dass
diese Pfade beim MCP-Dienst landen und nicht beim Portal:
/mcp-
/.well-known/oauth-protected-resource(deckt auch…/mcpab)
Auf einem eigenen Host genügt die Vorgabe path: /. Teilt sich MCP den
Host mit dem Portal, gehört / dem Portal; dann nur die beiden Pfade oben
eintragen:
ingress:
toolsMcp:
enabled: true
hosts:
- host: <weave-host>
paths:
- path: /mcp
pathType: Prefix
- path: /.well-known/oauth-protected-resource
pathType: Prefix
tls: [...] # wie bei den anderen IngressesDanach ausrollen.
Schritt 11 — Discovery abrufen.
curl -i https://<weave-host>/.well-known/oauth-protected-resource/mcpErwartet: 200 mit JSON, darin "resource": "https://<weave-host>/mcp" und
der Entra-Issuer unter authorization_servers.
Schritt 12 — MCP ohne Token aufrufen.
curl -i https://<weave-host>/mcpErwartet: 401 mit einem WWW-Authenticate-Header, der resource_metadata
und den Scope nennt.
Kommt bei einem der beiden eine HTML-Seite oder ein 404 des Portals zurück,
fehlt die Weiterleitung aus Schritt 10. Erst wenn beide Aufrufe stimmen, lohnt
sich Teil 4.
| Feld | Wert |
|---|---|
| Name | weave |
| Art | HTTP |
| URL |
https://<weave-host>/mcp — mit /mcp
|
| Header | leer lassen |
| Client-ID | <public-client-id> |
| Callback-Port |
<port> — derselbe wie in Schritt 6 |
| Scopes | api://<api-client-id>/mcp.read |
Speichern. Der Dialog schreibt die projektlokale .mcp.json; sie enthält
keine Geheimnisse, Tokens verwaltet Claude Code selbst.
claude mcp add --transport http --scope project --client-id <public-client-id> --callback-port <port> weave https://<weave-host>/mcpDen Scope muss man hier nicht angeben, der Server nennt ihn in seiner
401-Antwort.
Die Projektdatei .vscode/mcp.json im Repository ist bereits vorbereitet. Die
URL auf https://<weave-host>/mcp ändern; die Client-ID fragt VS Code beim
Start ab. Details in der
Doku.
Schritt 13 — Einmal im Portal über Entra anmelden. Nur dabei speichert Weave die Entra-Objekt-ID des Kontos. Wer das auslässt, kann sich per MCP zwar bei Entra anmelden, wird von Weave aber nicht erkannt.
Schritt 14 — Im Client anmelden.
- Claude Code:
/mcp→weave→ Authenticate, im Browser bei Entra anmelden. - VS Code:
MCP: List Servers→weave→ Start, Browser-Login.
Danach steht der Server auf „connected“, und die Werkzeuge list_collections
und search sind verfügbar.
| Was man sieht | Ursache | Lösung |
|---|---|---|
| Client meldet „Failed“, im Browser kommt eine 404-Seite des Portals | URL ohne /mcp oder Pfade landen beim Portal |
URL prüfen, Schritt 10 |
421 Misdirected Request |
Host stimmt nicht mit MCP_OAUTH_RESOURCE_URL überein |
Host in der Resource-URL korrigieren oder in MCP_ALLOWED_HOSTS ergänzen |
503 service misconfigured |
Resource-URL oder TOOLS_INTROSPECTION_TOKEN fehlt |
Schritt 9, neu ausrollen |
AADSTS50011 (Redirect URI mismatch) |
Port im Client ≠ registrierte Redirect-URI | Port und Schritt 6 angleichen |
AADSTS65001 (consent required) |
Admin-Zustimmung fehlt | Schritt 7 |
AADSTS7000218 (client_secret required) |
Public client flows aus | Schritt 6, „Allow public client flows“ |
AADSTS9010010 (resource does not match scope) |
Entra lehnt die mitgesendete Ressource https://<weave-host>/mcp ab |
Application ID URI der API-App testweise auf https://<weave-host>/mcp setzen und Scopes entsprechend anpassen |
Login klappt, danach immer 401
|
v1-Token, falscher Issuer oder falsche Audience | Schritt 4 und Schritt 9 (v2.0, nackte GUID) |
403 insufficient_scope |
Token ohne mcp.read
|
Scope im Client (Teil 4) und Schritt 7 |
401, obwohl alles stimmt |
Nutzer unbekannt, deaktiviert oder nie über Entra im Portal angemeldet | Schritt 13 |
- docs/integrations/vscode-mcp-sso.md — maßgebliche Fassung, auch für Keycloak
- Rechte-und-Sichtbarkeit, Abschnitt „MCP mit eigener Anmeldung (SSO)“
- Betrieb
Einstieg
Konzepte
Betrieb
Im Repository