Claude-Coach: pausierte Beta, Test und spätere Reaktivierung
Status: erhaltene, deaktivierte Implementierung in Entwicklung; derzeit nicht lernendenseitig sichtbar und nicht produktionsreif.
Diese Runbook-Seite beschreibt den additiven Claude-Coach neben dem aktuellen mehrsprachigen OpenAI-MCP-Coach. Der Custom-GPT-Visible-Session-Coach bleibt davon getrennt als Rollback-Quelle erhalten. Beide Adapter greifen auf dieselbe SkillPilot-Fachlogik, sichere State-Projektion und Exam-Autorisierung zu. Sie haben aber unterschiedliche Authentifizierungs-, Werkzeug- und Darstellungsgrenzen. Der ChatGPT-Pfad bleibt unabhängig und muss auch bei vollständig deaktiviertem Claude unverändert funktionieren.
Aktuelle UI-Pause (seit 21. Juli 2026): Die Claude-Option ist im Frontend zusätzlich durch den konstanten Release-Gate
CLAUDE_COACH_BETA_ENABLED = falseverborgen. Ein gesetztesVITE_CLAUDE_BETA_ENABLEDkann sie während dieser Pause nicht einblenden. Backend-, OAuth- und MCP-Sourcen bleiben erhalten. Die spätere Reaktivierung ist eine bewusste Code- und Deploymententscheidung.
Die zuvor offenen gemeinsamen Codepunkte sind geschlossen:
setPersonalizationbildet die entsprechende State-Machine-Aktion ab;getCoachContextverwendet die gemeinsameCoachStateProjectionund liefert bei einem aktiven freigegebenen Exam nur Aufgabe und Maximalpunkte;getExamEvaluationdelegiert an den gemeinsamen Exam-Use-Case derCoachToolFacade, der aktives Ziel, Prüfungstyp, Freigabe und Vollständigkeit prüft, bevor Lösung und Bewertungsraster ausgegeben werden;- normale Coach-Responses enthalten weder dauerhafte SkillPilot-ID noch
copySources, Prüfungslösung, Bestehensgrenze oder Scoring-Schritte.
Der Evaluationsaufruf besitzt wie der ChatGPT-MCP-Kanal noch keinen unabhängigen serverseitigen Nachweis einer vorherigen Lernendenabgabe. Da SkillPilot kein Chatprotokoll erhält, bleibt die Reihenfolge instruktionsgestützt. Ein starker Nachweis erfordert später einen direkten Widget-/Cockpit-Attempt und ist keine Voraussetzung für die fachliche Verhaltensparität.
Offener Release-Blocker ist weiterhin die abgeschlossene reale Claude-End-to-End-Acceptance-Evidenz für sämtliche Setup-, Personalisierungs-, Navigation-, Mastery-, Recall-, Ressourcen- und Prüfungsabläufe. Bis dahin bleiben die echten Claude-Coach-Tools ausgeschaltet. Transport- und Regressionstests finden nur in einer isolierten, kontrollierten Testumgebung mit synthetischen Daten statt.
Abgrenzung der Coach-Varianten
| Variante | Kontextbindung | Aktueller Status |
|---|---|---|
| ChatGPT MCP-App | normales TLS plus OAuth/PKCE, exakte Resource/Audience/Scopes und absolute 24h-Lernsession | aktueller mehrsprachiger ChatGPT-Pfad; allgemeine Freigabe nach sicherem OAuth-Cutover und Acceptance |
| ChatGPT Visible Session | sichtbares, höchstens 24 Stunden gültiges sps_...-Token im Startprompt und Footer |
isolierter Rollback, nicht aktuelle Referenzarchitektur |
| Claude OAuth/MCP | Backend löst ein authentifiziertes OAuth-Subject auf; generischer Prompt ohne sichtbares Sitzungstoken | Codepfade ergänzt und sicher projiziert; pausiert bis zur echten vollständigen Acceptance |
| Legacy Custom GPT | einmaliger Startcode und anschließendes verborgenes Sitzungstoken | unveränderte koordinierte Rollback-Quelle |
Architektur
Es gibt keinen zweiten Serverprozess und keinen Node-Dienst im Betrieb:
SkillPilot UI ─┐
├─ HTTPS / Reverse Proxy ─ Spring Boot :8080 ─ PostgreSQL
Claude MCP ───┤ ├ UI- und Coach-API
Claude OAuth ──┘ ├ OAuth Authorization Server
└ Streamable-HTTP-MCP-Server
Der React-Build wird weiterhin als statischer Bestandteil des Spring-Boot-Artefakts ausgeliefert. OAuth, MCP und die bisherigen REST-Endpunkte laufen im selben Spring-Boot-Prozess. Der bestehende Reverse Proxy muss lediglich alle benötigten Pfade unverändert an diesen Prozess weiterleiten.
Bei einer kontrollierten Aktivierung exponierte Endpunkte:
| Zweck | URL |
|---|---|
| MCP, Streamable HTTP | https://skillpilot.com/api/claude/mcp |
| MCP Protected Resource Metadata | https://skillpilot.com/api/claude/oauth/protected-resource |
| OAuth Authorization Server Metadata | https://skillpilot.com/.well-known/oauth-authorization-server |
| OAuth Authorize / Token / Revoke | https://skillpilot.com/oauth2/authorize, /oauth2/token, /oauth2/revoke |
| Claude-CIMD-Client-ID | https://claude.ai/oauth/mcp-oauth-client-metadata |
| Claude OAuth Callbacks | https://claude.ai/api/mcp/auth_callback, https://claude.com/api/mcp/auth_callback |
| UI-Verbindungsstart | /api/ui/learners/{skillpilotId}/claude/connect-start |
| UI-Coach-Start | /api/ui/learners/{skillpilotId}/claude/launch |
| UI-Verbindungsstatus | GET /api/ui/learners/{skillpilotId}/claude/status |
| UI-Verbindung trennen | DELETE /api/ui/learners/{skillpilotId}/claude/connection |
Feature-Flags und Konfiguration
Es gibt derzeit kein wirksames Frontend-Build-Flag. Die UI ist durch den
Source-Level-Release-Gate CLAUDE_COACH_BETA_ENABLED = false fest verborgen und
kann nur durch eine bewusste Codeänderung plus Neubau reaktiviert werden. Die
Backend-Werte sind Spring-Boot-Runtime-Konfiguration und gehören für einen
kontrollierten Test in das systemd-Environment beziehungsweise dessen
EnvironmentFile.
| Variable | Sicherer aktueller Wert | Bedeutung |
|---|---|---|
VITE_CLAUDE_BETA_ENABLED |
wirkungslos/entfernt lassen | Historisches, nicht mehr ausgewertetes Build-Time-Flag. |
SKILLPILOT_CLAUDE_ENABLED |
false |
Master-Schalter für UI-Routen, OAuth und Tokenprüfung. Nur in einem autorisierten Testfenster aktivieren. |
SKILLPILOT_CLAUDE_MCP_ENABLED |
false |
Schaltet den Spring-AI-MCP-Transport ein; erbt ohne eigenen Wert vom Master-Schalter. |
SKILLPILOT_CLAUDE_COACH_TOOLS_ENABLED |
bei jedem Test explizit false |
Die Repository-Voreinstellung ist bei deaktiviertem Master dormant. Echte Coach-Tools nur in einem autorisierten Acceptance-Fenster aktivieren. |
SKILLPILOT_CLAUDE_REGRESSION_TOOLS_ENABLED |
false |
Exponiert nur bei gezielten Regressionstests zusätzlich die synthetischen Probe-Tools; im Coach-Betrieb ausgeschaltet lassen. |
SKILLPILOT_PUBLIC_BASE_URL |
https://skillpilot.com |
Öffentlicher OAuth-Issuer. |
SKILLPILOT_CLAUDE_MCP_URL |
https://skillpilot.com/api/claude/mcp |
Öffentliche MCP-Resource/Audience. |
SKILLPILOT_CLAUDE_RESOURCE_METADATA |
https://skillpilot.com/api/claude/oauth/protected-resource |
URL im WWW-Authenticate-Challenge. |
SKILLPILOT_CLAUDE_OAUTH_CLIENT_ID |
https://claude.ai/oauth/mcp-oauth-client-metadata |
Von Anthropic gehostete CIMD-URL; nur nach verifizierter Anbieteränderung überschreiben. |
SKILLPILOT_CLAUDE_SECURE_COOKIE |
true |
Erzwingt das Secure-Attribut des kurzlebigen Binding-Cookies. |
SKILLPILOT_CLAUDE_BINDING_TTL |
PT5M |
Gültigkeit des einmaligen Browser-Bindings. |
SKILLPILOT_CLAUDE_LAUNCH_TTL |
PT5M |
Gültigkeit eines normalen Coach-Starts. |
SKILLPILOT_CLAUDE_ACCESS_TOKEN_TTL |
PT1H |
Gültigkeit eines opaken OAuth-Access-Tokens. |
SKILLPILOT_CLAUDE_REFRESH_TOKEN_TTL |
P30D |
Gültigkeit des rotierenden Refresh-Tokens. |
SKILLPILOT_SIGNING_SECRET |
starker, stabiler Secret-Wert | HMAC-Schutz kurzlebiger Grants; nie mit dem unsicheren Default betreiben. |
SKILLPILOT_CLAUDE_MCP_ENABLED=true bei ausgeschaltetem Master-Schalter ist
keine zulässige Konfiguration. Beim Ein- und Ausschalten immer beide Schalter
konsistent setzen.
Die persistente Registrierung des bekannten Claude-Clients wird bei jedem Spring-Boot-Start mit Callback-URLs, Scopes und den beiden konfigurierten Token-TTLs abgeglichen. Änderungen dieser Werte greifen damit nach einem kontrollierten Neustart.
OAuth, CIMD und MCP
Der Connector verwendet OAuth Authorization Code mit PKCE (S256). Claude ist
ein öffentlicher Client ohne Client-Secret. Die Claude-CIMD-URL ist zugleich die
Client-ID und wird für diese Beta explizit zugelassen. Ein offener Dynamic Client
Registration Endpoint (DCR) ist nicht erforderlich und wird nicht angeboten.
Der Consent umfasst:
skillpilot.read: Lernstand und aktuelle Lernziele lesen;skillpilot.write: Lernfortschritt nach Anweisung aktualisieren;offline_access: Verbindung durch ein rotierendes Refresh-Token erhalten.
Das MCP-Endpoint ist stateless und verlangt ein opakes Bearer-Token. Ohne Token
antwortet es mit 401 sowie einem WWW-Authenticate-Header, der auf die
Protected Resource Metadata verweist. Schreibende Tools prüfen zusätzlich den
Write-Scope. getCoachContext lädt den aktuellen Zustand erneut; der Coach soll
nicht darauf angewiesen sein, dass ältere Tool-Responses noch im Modellkontext
liegen. Authorization- und Token-Requests werden nur für die exakt konfigurierte
MCP-Resource akzeptiert; ein fehlender oder fremder resource-Wert liefert
invalid_target.
Nutzerfluss und Gerätewechsel
Einmal verbinden
- Die volljährige Testperson startet auf SkillPilot und wählt ihr Curriculum.
- Claude einmalig verbinden ruft
connect-startauf. - Das Backend erzeugt einen einmaligen, fünf Minuten gültigen Grant und setzt
ihn als
HttpOnly; Secure; SameSite=Lax-Cookie nur für/oauth2/authorize. - Die UI öffnet die vorbefüllte offizielle Connector-Seite von Claude.
- Der OAuth-Redirect erreicht im selben Browser SkillPilot. Das Backend verbraucht den Grant, zeigt die Scopes und bindet ein opakes Connection-Subject an den Lernstand. Als „verbunden“ gilt es erst, nachdem der Token-Endpoint tatsächlich einen Access-Token ausgestellt hat. Das Cookie wird anschließend gelöscht.
Der erste OAuth-Schritt muss in dem Browser abgeschlossen werden, in dem
SkillPilot connect-start ausgeführt hat. Der Grant steht weder in der
Connector-URL noch in einem Chat-Prompt. Der Verbindungsbutton öffnet die
Connector-Einrichtung auch dann erneut, wenn im Backend bereits eine frühere
Verbindung bekannt ist; so lässt sich ein in Claude gelöschter Connector oder ein
anderes Claude-Konto gezielt neu verbinden. Die alte Verbindung bleibt bis zur
erfolgreichen neuen Token-Ausgabe funktionsfähig und wird dann mitsamt ihren
OAuth-Grants ersetzt.
Normal starten
- Mit Claude starten prüft zuerst den Verbindungsstatus. Fehlt die erste Verbindung noch, öffnet derselbe Klick stattdessen die Connector-Einrichtung.
- Bei bestehender Verbindung ruft die UI
launchauf. Das Endpoint lehnt einen Start ohne vorherige Verbindung mit409 Conflictab. - Das Backend hinterlegt für fünf Minuten einen Pending Launch an der bereits autorisierten Verbindung.
- Die UI öffnet Claude und kopiert nur den kurzen, generischen Startprompt. Es gibt darin weder ein sichtbares ChatGPT-Sitzungstoken noch eine SkillPilot-ID.
- Claude ruft
getCoachContextauf. Das Backend ordnet das OAuth-Subject dem Lernstand zu und verbraucht den für genau diese Verbindung hinterlegten Pending Launch.
Da der Start absichtlich keinen sichtbaren Chatcode enthält, immer nur einen neuen Claude-Coach-Chat gleichzeitig vorbereiten. Die Verbindung kann in SkillPilot jederzeit über Claude-Verbindung trennen widerrufen werden; dabei werden ihre Pending Launches sowie Access-, Refresh- und Consent-Datensätze serverseitig ungültig gemacht.
Ob ein neu geöffneter Claude-Chat den Connector ohne weitere Auswahl aktiviert, muss im echten Claude-Acceptance-Test geprüft werden. Falls Claude ihn nicht automatisch anbietet, aktiviert die Testperson SkillPilot einmal im Connector-Menü dieses Chats; die kopierte Startnachricht fordert den Connector anschließend ausdrücklich an.
Notebook und Mobil-App
Web und Claude Desktop bleiben der primäre Weg zum Hinzufügen des Custom Connectors. Die Installation in Claude für iOS und Android ist derzeit ebenfalls möglich, aber noch Beta. Nach der Verbindung steht der Connector im selben Claude-Konto geräteübergreifend zur Verfügung. Für den Wechsel:
- auf dem Notebook den SkillPilot-Coach in Claude starten;
- in der Mobile-App mit demselben Claude-Konto und Workspace denselben Chat aus dem Verlauf öffnen;
- dort zum Beispiel ein Foto aufnehmen und im bestehenden Chat weiterarbeiten.
Der Gerätewechsel benötigt weder Startcode noch sichtbares ChatGPT-Sitzungstoken. Er hängt aber von Claude-Konto, Workspace, Chat-Synchronisation und einem dort aktivierten Connector ab. Wird ein anderes Claude-Konto verbunden, ersetzt es nach erfolgreichem OAuth die vorige Verbindung dieses SkillPilot-Lernstands.
Altersgrenze, Datenschutz und Secrets
- Claude.ai ist nach Anthropic-Vorgabe ein Angebot ab 18 Jahren. Diese Beta darf deshalb nicht als Lernweg für Minderjährige beworben oder freigeschaltet werden. Ein späterer minderjährigengerechter Weg über eine eigene SkillPilot-UI und die Anthropic API wäre ein separates Produkt- und Safeguard-Projekt.
- Der Source-Level-Release-Gate ist global und keine Alters- oder Nutzer-Allowlist. Eine spätere Aktivierungsregel darf deshalb nur für eine kontrollierte Beta-Umgebung beziehungsweise einen bewusst abgegrenzten Test mit volljährigen Personen geöffnet werden.
- Die dauerhafte SkillPilot-ID bleibt zwischen SkillPilot-UI und Backend. Sie ist
weder OAuth-Principal noch MCP-Parameter und wird aus den explizit erlaubten
Coach-Response-Feldern vollständig weggelassen. Auch
copySourceswerden nicht an Claude ausgegeben, weil sie IDs anderer Lernstände enthalten können. - Die SkillPilot-ID ist im bisherigen Produkt zugleich ein Bearer-Geheimnis für den Lernstand. Sie darf daher weder in Claude, Logs, Screenshots noch fremden Browserprofilen offengelegt werden.
- Anthropic hält als OAuth-Client notwendigerweise Access- und Refresh-Token. Das Modell erhält diese Token jedoch nicht als Prompt, Tool-Argument oder Tool-Response. SkillPilot speichert die opaken Token über den Spring Authorization Server in PostgreSQL; Datenbank und Backups sind entsprechend als Secret-Material zu schützen.
- Der Browser-Binding-Grant wird serverseitig nur als HMAC gespeichert, einmalig verbraucht und kurz befristet. Der normale Launchprompt ist generisch.
- Claude sieht die für das Coaching erforderlichen Lernziele, Lernstände, Antworten und vom Benutzer hochgeladenen Inhalte. Dafür gelten zusätzlich die Datenschutz- und Aufbewahrungsregeln des gewählten Claude-Kontos.
- Nie
Authorization,Cookie,Set-Cookie, OAuth-Codes oder Token in Logs, Screenshots, Support-Tickets oder MCP-Inspector-Exports übernehmen. Auch SkillPilot-ID-haltige UI-Pfade nur mit geschützten und befristeten Access-Logs betreiben. - Der allgemeine Request-Logger protokolliert für
/api/claude/mcpbewusst keine Request- oder Response-Bodies, auch nicht auf DEBUG. - Nur den Connector-Link von
skillpilot.comverwenden und die angezeigten Scopes prüfen. Custom Connectors sind bei Anthropic weiterhin Beta.
Custom Connectors sind derzeit für Free, Pro, Max, Team und Enterprise verfügbar; im Free-Plan ist höchstens ein Custom Connector möglich. Bei Team/Enterprise können zusätzlich Freigaben durch Owner erforderlich sein.
Reaktivierungs- und Rollout-Gate
- Die implementierte Personalisierung, gemeinsame State-Projektion und Exam-Autorisierung in den Backend-Regressionstests grün halten. Normale Context-Serialisierung muss weiterhin per Negativtest frei von Lösung und Bewertungsraster bleiben.
- Vor der ersten kontrollierten Aktivierung Datenbank-Backup erstellen und den bekannten Git-Stand markieren. Die Liquibase-Erweiterung ist additiv.
- In einer isolierten Staging-/Testumgebung Master und MCP aktivieren, echte Coach-Tools aber explizit deaktiviert lassen. Discovery, OAuth-Challenge und MCP-Transport prüfen.
- Mit einem leeren Test-Lernstand und einem volljährigen Claude-Testkonto den
isolierten MCP-Regressionslauf ausführen: Coach-Tools aus, synthetische
Regressionstools an. Die öffentliche Kurzfassung liegt unter
/claude/mcp-regression, das vollständige Protokoll unterai/claude/mcp-regression/TEST_PROTOCOL.md. - Danach ein separat autorisiertes Coach-Acceptance-Fenster öffnen:
Regressionstools aus, Coach-Tools an; alle
Setup-, Navigations-, Mastery-, Recall-, Ressourcen- und Prüfungsabläufe testen.
Die Prüfung muss ausdrücklich zeigen, dass
getCoachContextkeine Lösung enthält undgetExamEvaluationerst nach sichtbarer vollständiger Antwort aufgerufen wird. - End-to-End-Evidenz für Web und den vorgesehenen Gerätewechsel festhalten.
- Erst danach den Source-Level-Gate in
app/src/utils/claudeCoach.tsan eine überprüfte Aktivierungsregel anbinden, neu bauen und über eine Beta-Freigabe entscheiden. ChatGPT parallel über den aktuellen mehrsprachigen V1-MCP-App-Pfad prüfen; Visible Session nur als getrennten Rollback-Smoke-Test verwenden.
Smoke-Test für kontrollierte Staging-/Testumgebungen
Voraussetzungen: curl, jq, eine dedizierte Test-SkillPilot-ID und keine
Ausgabeumleitung in geteilte CI-Logs.
BASE=https://skillpilot.com
TEST_LEARNER_ID='<dedizierte-test-id>'
curl -fsS "$BASE/.well-known/oauth-authorization-server" \
| jq -e --arg base "$BASE" \
'.issuer == $base
and .client_id_metadata_document_supported == true
and (.code_challenge_methods_supported | index("S256"))'
curl -fsS "$BASE/api/claude/oauth/protected-resource" \
| jq -e --arg resource "$BASE/api/claude/mcp" \
'.resource == $resource
and (.scopes_supported | index("skillpilot.read"))
and (.scopes_supported | index("skillpilot.write"))'
curl -sS -o /dev/null -D - \
-X POST "$BASE/api/claude/mcp" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2025-11-25' \
--data '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl-smoke","version":"1"}}}' \
| sed -n '/^HTTP\|^[Ww][Ww][Ww]-Authenticate/p'
Erwartung beim dritten Aufruf: 401 und ein WWW-Authenticate-Header mit
resource_metadata="https://skillpilot.com/api/claude/oauth/protected-resource".
Isolierter Claude-MCP-Basistest
Vor dem ersten echten Coach-Aufruf nur die synthetischen Werkzeuge exponieren:
--skillpilot.claude.mcp.coach-enabled=false
--skillpilot.claude.mcp.regression-enabled=true
Nach dem Neustart einen leeren Test-Lernstand über den normalen OAuth-Fluss
verbinden. Die transparenten Einzelprompts für einen unmittelbaren Aufruf, die
Übergabe im selben Turn und die backend-bestätigte Übergabe über die nächste
Nutzernachricht stehen auf https://skillpilot.com/claude/mcp-regression. Die
Prompt-Datei ist eine Anleitung für die testende Person und wird nicht als
dauerhaftes Protokoll vollständig in Claude eingefügt. Die Claude-MCP-Werkzeuge
verwenden dafür ausschließlich die harmlosen Felder probe_id, sample_marker
und integrity_tag; das OpenAI-REST-Schema bleibt unverändert. Der Cross-Turn-Lauf
gilt nur dann als bestanden, wenn der Verifier integrity_valid=true liefert und
die privacy-sicheren Auditereignisse für denselben probe_id identische Hashes
enthalten. Zwischen den beiden Cross-Turn-Nachrichten den Prozess nicht neu
starten. Eine Ablehnung des Testauftrags wird als Policy-Refusal und nicht als
Retention-Fehler erfasst.
Vor dem erneuten Laden des Connectors muss
https://skillpilot.com/claude/mcp-regression/status.json den Status ready,
regression_tools_ready=true und genau die beiden registrierten Regressionstools
melden. Der Endpunkt veröffentlicht nur effektive Feature-Schalter und Toolnamen,
keine OAuth-, Lernenden- oder Signaturdaten.
Nach dem isolierten Regressionstest in den sicheren pausierten Zustand zurückkehren und neu starten:
--skillpilot.claude.enabled=false
--skillpilot.claude.mcp.enabled=false
--skillpilot.claude.mcp.coach-enabled=false
--skillpilot.claude.mcp.regression-enabled=false
Bereits offene Claude-Chats können Tool-Metadaten zwischenspeichern; die
spätere, separat autorisierte Coach-Abnahme deshalb in einem frischen Chat
durchführen. Das vollständige Evidenz- und Cleanup-Protokoll steht in
ai/claude/mcp-regression/TEST_PROTOCOL.md.
Optional den UI-Start mit einer reinen Test-ID prüfen. Die Cookie-Datei enthält einen kurzlebigen Secret-Wert und wird deshalb sofort gelöscht:
COOKIE_JAR="$(mktemp "${TMPDIR:-/tmp}/skillpilot-claude.XXXXXX")"
trap 'rm -f "$COOKIE_JAR"' EXIT
curl -fsS -c "$COOKIE_JAR" \
-X POST "$BASE/api/ui/learners/$TEST_LEARNER_ID/claude/connect-start" \
-H 'Content-Type: application/json' \
--data '{"language":"de","client":"rollout-smoke"}' \
| jq -e '.installUrl | startswith("https://claude.ai/customize/connectors?")'
connect-start allein stellt noch keine Verbindung her. Vor abgeschlossenem
OAuth-Consent muss launch deshalb 409 liefern. Nach der echten Verbindung mit
dem Claude-Testkonto denselben Start separat prüfen:
curl -fsS \
-X POST "$BASE/api/ui/learners/$TEST_LEARNER_ID/claude/launch" \
-H 'Content-Type: application/json' \
--data '{"language":"de","client":"rollout-smoke"}' \
| jq -e '.prompt != "" and .webUrl == "https://claude.ai/new"'
MCP Inspector
npx -y @modelcontextprotocol/inspector@latest
Im Inspector Streamable HTTP und
https://skillpilot.com/api/claude/mcp wählen. Ohne Credential muss der
Inspector den 401-Challenge und die beiden Metadata-Dokumente erreichen. Der
kontrollierte Beta-Entwurf akzeptiert absichtlich nur den zugelassenen
Claude-CIMD-Client;
ein beliebiger Inspector-OAuth-Client muss den Consent daher nicht abschließen.
Für einen authentifizierten Tool-Test entweder den echten Claude-Testconnector
verwenden oder in einer isolierten Staging-Umgebung einen eigenen Inspector-Client
registrieren. Falls dort ein kurzlebiges Staging-Bearer-Token verwendet wird,
kann es in der Inspector-UI eingetragen werden. Danach müssen mindestens
getCoachContext, setCurriculum, setPersonalization, setScope,
setActiveGoal, setMastery, startVerifiedRecall,
getVerifiedRecallAnswer, recordVerifiedRecallResult und
getExamEvaluation sichtbar sein.
Produktions-Token niemals aus Datenbank oder Netzwerkverkehr extrahieren, nur um
einen Inspector-Test zu erzwingen.
Reverse Proxy
Wenn der vorhandene Catch-all bereits jeden Pfad unverändert an Spring Boot
weitergibt, ist keine Nginx-Änderung nötig. Andernfalls müssen mindestens
/.well-known/, /oauth2/, /api/claude/ und die vorhandenen /api/ui/-Pfade
denselben Spring-Boot-Prozess erreichen. Besonders /.well-known/ darf weder als
statische Datei noch als SPA-index.html beantwortet werden.
Minimaler zusätzlicher Nginx-Block, nur falls der Catch-all fehlt:
location ^~ /.well-known/ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
proxy_read_timeout 300s;
}
Für /oauth2/ und /api/claude/ gelten dieselben Header- und TLS-Anforderungen.
proxy_pass darf den Originalpfad nicht entfernen. Nach jeder Proxy-Änderung den
oben genannten Discovery-curl ausführen; Content-Type muss JSON sein und der
Issuer muss https://skillpilot.com lauten.
Rollback
Schneller sicherer Rückweg ohne Auswirkungen auf ChatGPT:
- Bei einem Security- oder Datenrisiko sofort
SKILLPILOT_CLAUDE_MCP_ENABLED=falseundSKILLPILOT_CLAUDE_ENABLED=falsesetzen und Spring Boot neu starten. - Den konstanten Frontend-Release-Gate auf
falsebelassen und neu deployen; die Claude-Buttons bleiben damit unabhängig von historischen Build-Time-Werten verborgen. - Den Claude-Änderungscommit mit
git revert <commit>zurücknehmen und über den normalen Deploymentweg ausrollen. Keingit reset --hardauf dem Server. - Die additiven Liquibase-Tabellen bei einem normalen Rollback nicht löschen. Bestehende Token bleiben bei deaktivierten Endpunkten unbrauchbar; bei einem Security-Incident zusätzlich vor dem Abschalten über die UI-Verbindungstrennung Token/Connections widerrufen und Secrets rotieren.
- Custom-GPT-Start, RegressionGPT und das SkillPilot-Cockpit erneut prüfen.
Offizielle Quellen
- Claude-Dokumentation: Custom Connectors bauen und testen: https://claude.com/docs/connectors/building
- Claude-Dokumentation: OAuth, CIMD, PKCE, Callback und Token Refresh: https://claude.com/docs/connectors/building/authentication
- Claude-Dokumentation: Directory- und Custom-Connectoren: https://claude.com/docs/connectors/building/directory-vs-custom
- Claude Help Center: Custom Connectors, Pläne, Einrichtung und Sicherheit: https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp
- Claude Help Center: Connectoren auf Web, Desktop und Mobile: https://support.claude.com/en/articles/11176164-use-connectors-to-extend-claude-s-capabilities
- Anthropic: 18+-Grenze von Claude.ai: https://www.anthropic.com/policy
- MCP Authorization Specification, einschließlich CIMD, PKCE und Discovery: https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization
- MCP Inspector: https://modelcontextprotocol.io/docs/tools/inspector
- Offizielles MCP-Inspector-Repository und Bearer-Token-Hinweise: https://github.com/modelcontextprotocol/inspector