Skycloak
offiziellMCP-Server für Skycloak-verwaltetes Keycloak. Verwalten Sie Cluster, Realms, Anwendungen, SSO und Benutzer über jeden MCP-Client.
Was kann man mit Skycloak MCP machen?
-
Cluster-Upgrade-Review — Fragen Sie, welche Keycloak-Cluster bei Upgrades im Rückstand sind, und erhalten Sie den empfohlenen weiteren Weg über
list_cluster_upgradesundget_cluster_upgrade_path. -
Realm-Bereitstellung — Erstellen Sie einen Staging-Realm auf einem bestimmten Cluster mit konfigurierten Identitätsanbietern, mithilfe von
create_realmundcreate_identity_provider. -
Benutzeraktivitäts-Audit — Finden Sie heraus, wer kürzlich zu einem Realm hinzugefügt wurde, und überprüfen Sie Admin-Änderungen, unter Nutzung von
list_realm_usersundquery_events. -
SIEM-Integrationssetup — Konfigurieren Sie ein Ziel, das Admin-Ereignisse an einen externen Webhook weiterleitet, mithilfe von
create_siem_destinationundtest_siem_destination. -
Theme-Inhaltsersetzung — Aktualisieren Sie das Archiv eines benutzerdefinierten Themes direkt, ohne dessen Zuweisungen zu verlieren, über
update_theme_contentmit Bestätigung. -
Routing für benutzerdefinierte Domains — Fügen Sie eine benutzerdefinierte Domain hinzu, rufen Sie die zu erstellenden DNS-Einträge ab, verifizieren Sie diese und leiten Sie den Datenverkehr zu einem Realm, mithilfe von
create_domainundverify_domain.
Dokumentation
skycloak-mcp
Offizieller Model Context Protocol-Server für Skycloak (verwaltetes Keycloak): Verwalten Sie Ihre Cluster, Realms, Anwendungen und SSO von jedem MCP-Client aus (Claude Desktop, Claude Code, Cursor).
Status: frühe Veröffentlichung. Die Tool-Abdeckung wächst; siehe das Changelog für das, was verfügbar ist.
Schnellstart
claude mcp add --transport http skycloak https://mcp.skycloak.io
Kein API-Schlüssel, keine Client-ID, keine Konfiguration. Ihr Browser öffnet sich, Sie melden sich bei Skycloak an, und die Tools erscheinen. Jeder MCP-Client, der streambares HTTP spricht, funktioniert auf dieselbe Weise: Geben Sie ihm die URL und sonst nichts.
Dann fragen Sie zum Beispiel:
- „Welche meiner Keycloak-Cluster sind bei Upgrades im Rückstand?"
- „Erstelle einen Staging-Realm auf dem EU-Cluster mit Google- und GitHub-Anmeldung."
- „Wer wurde in der letzten Woche zum Produktions-Realm hinzugefügt?"
- „Richte ein SIEM-Ziel ein, das Admin-Ereignisse an unseren Datadog-Webhook weiterleitet."
Authentifizierung & Sicherheit
- Gehostetes HTTP, mit OAuth (keine Anmeldedaten zu konfigurieren). Richten Sie Ihren Client auf
https://mcp.skycloak.ioohne Header. Der Server antwortet401mit einem Verweis auf seine RFC 9728-Metadaten unter/.well-known/oauth-protected-resource, der Client führt den Browser-Autorisierungscode-Flow gegen den Skycloak-Login-Realm aus, und das Zugriffstoken, das er zurückbekommt, wird gegen einen kurzlebigen, arbeitsbereichsbezogenen API-Schlüssel eingetauscht, mit dem die Sitzung läuft. Der Schlüssel hält eine Stunde und wird automatisch erneuert. Nichts wird in Ihrer Client-Konfiguration gespeichert. - Gehostetes HTTP, mit einem API-Schlüssel. Erstellen Sie einen Schlüssel im Skycloak-Dashboard und senden Sie ihn als
Authorization: Bearer <key>(oderAPI-Key: <key>). Jede Anfrage trägt ihre eigene Anmeldeinformation und handelt nur als der Arbeitsbereich dieser Anmeldeinformation. Der Server speichert keinen Sitzungszustand, sodass eine Anfrage niemals die eines anderen Aufrufers erbt. Schlüssel werden vor der Verwendung nicht verifiziert: Die Skycloak-API ist die Autorität, sodass ein ungültiger Schlüssel als401beim ersten Tool-Aufruf auftaucht, nicht beim Verbinden. - Tools entsprechen Ihrer Rolle. Über OAuth wird die Tool-Liste auf das beschnitten, was die Bereiche der Sitzung erlauben, sodass einem schreibgeschützten Arbeitsbereichsmitglied keine Schreib-Tools angezeigt werden, die mit
403antworten würden. Mit einem API-Schlüssel ist die gesamte Oberfläche registriert, da die Bereiche eines Schlüssels für den Server nicht sichtbar sind, und ein nicht autorisierter Aufruf taucht als403von der API auf. - Lokales stdio. Führen Sie
skycloak-mcp initaus und genehmigen Sie in Ihrem Browser (OAuth-2.0-Geräteautorisierungs-Flow). Es erstellt einen arbeitsbereichsbezogenen API-Schlüssel, speichert ihn in Ihrem Betriebssystem-Schlüsselbund und erkennt Ihren Standardarbeitsbereich automatisch (übergeben Sie--workspace <id>, um einen anderen zu wählen).skycloak-mcp logoutentfernt den gespeicherten Schlüssel. - Headless / CI. Setzen Sie die Umgebungsvariable
SKYCLOAK_API_KEY(erstellen Sie einen Schlüssel im Skycloak-Dashboard), um den Browser vollständig zu überspringen. Sie hat immer Vorrang vor dem Schlüsselbund. - Schreibvorgänge werden durch Ihre Anmeldeinformation gesteuert, nicht durch ein Flag. Der gehostete Server unter
https://mcp.skycloak.ioläuft schreibfähig, und was Sie tatsächlich ändern können, wird durch die Bereiche Ihres Schlüssels und Ihre Arbeitsbereichsrolle begrenzt: Ein schreibgeschütztes Mitglied kann nichts mutieren, egal was die Tool-Liste sagt. Fügen Sie?readonly=truezur URL hinzu, um eine schreibgeschützte Tool-Oberfläche für eine Sitzung zu erzwingen. Das lokale Binärprogramm ist umgekehrt und registriert keine Schreib-Tools, es sei denn, es wird mit--allow-writesgestartet. - Cluster-Anmeldedaten sind optional.
get_cluster_credentialsgibt die Keycloak-Admin-Anmeldedaten eines Clusters zurück, die ein Assistent, der den Schlüssel hält, dann sehen würde, daher fordertinitdiesen Bereich standardmäßig nicht an. Verwenden Sie einen Schlüssel, der ihn trägt: Erstellen Sie einen im Dashboard, oder melden Sie sich über stdio mitskycloak-mcp init --allow-credentialsan. Ohne ihn gibt das Tool ein 403 zurück, das beide Wege erklärt. - Destruktive Tools erfordern Bestätigung: Das Löschen eines Realms erfordert zum Beispiel ein explizites
confirm=true-Argument. - Anfragen werden gemäß Ihrem Skycloak-Plan ratenbegrenzt; bei einer
429-Antwort zeigt der ServerRetry-Afteran.
Tools
137 Tools: 60 schreibgeschützt und 77 schreibend. Schreibgeschützte Tools sind immer verfügbar. Auf dem gehosteten Server sind die Schreib-Tools ebenfalls registriert und durch die Bereiche Ihrer Anmeldeinformation gesteuert; das lokale Binärprogramm registriert sie nur, wenn es mit --allow-writes gestartet wird.
Tool-Namen tragen ein skycloak_-Präfix, das die folgende Tabelle weglässt, sodass list_clusters in Ihrem Client skycloak_list_clusters ist.
| Bereich | Schreibgeschützt | Schreibend (--allow-writes) |
|---|---|---|
| Cluster | list_clusters, get_cluster, list_cluster_locations, list_cluster_types, list_cluster_features, list_cluster_versions, list_cluster_upgrades, get_cluster_upgrade_path, get_cluster_credentials, get_cluster_insights, get_cluster_maintenance_window | create_cluster, update_cluster, delete_cluster, cancel_cluster_upgrade, restart_cluster_instances, set_cluster_maintenance_window, delete_cluster_maintenance_window |
| Edge-Sicherheit | get_cluster_security, list_cluster_captcha_domains | update_cluster_security, add_cluster_captcha_domain, remove_cluster_captcha_domain |
| Realms | list_realms, get_realm | create_realm, update_realm, delete_realm |
| Anwendungen | list_applications, get_application, list_application_roles, list_application_sessions | create_application, update_application, delete_application, assign_application_role, remove_application_role, rotate_application_secret |
| Identitätsanbieter | list_identity_providers, get_identity_provider, list_identity_provider_templates, discover_oidc | create_identity_provider (OIDC), update_identity_provider, delete_identity_provider, test_identity_provider |
| Benutzer, Rollen & Gruppen | list_realm_users, get_realm_user, list_realm_roles, get_realm_role, list_realm_groups, get_realm_group, list_realm_group_members, list_user_roles, list_user_groups | create_realm_user, update_realm_user, delete_realm_user, create_realm_role, update_realm_role, delete_realm_role, create_realm_group, update_realm_group, delete_realm_group, assign_realm_user_role, remove_realm_user_role, add_realm_user_to_group, remove_realm_user_from_group |
| Benutzerdefinierte Domains | list_domains, get_domain, list_domain_routes, get_domain_route | create_domain, verify_domain, delete_domain, create_domain_route, update_domain_route, delete_domain_route |
| Branding & Themes | list_themes, get_theme, get_theme_assignment, get_client_theme_assignment, get_login_branding, get_email_branding, download_theme_content, get_theme_settings | set_theme_assignment, set_client_theme_assignment, update_theme, update_theme_content, update_theme_settings, delete_theme, upsert_login_branding, delete_login_branding, upsert_email_branding, delete_email_branding |
| Erweiterungen | list_extensions, list_cluster_extensions | install_extension, upgrade_extension, update_extension, uninstall_extension, delete_extension |
| SMTP | get_smtp | upsert_smtp, delete_smtp, test_smtp |
| Exporte & Protokolle | list_exports, get_export, get_logs, get_security_logs, query_events | create_export, delete_export, export_cluster_events |
| Realm-Import & -Export | get_realm_export, get_realm_import | create_realm_export, create_realm_import, create_realm_import_upload_url |
| SIEM | list_siem_destinations, get_siem_destination | create_siem_destination, update_siem_destination, delete_siem_destination, test_siem_destination |
| Webhooks | list_webhook_event_types, list_webhook_subscriptions, get_webhook_subscription | create_webhook_subscription, update_webhook_subscription, delete_webhook_subscription, test_webhook_subscription |
Konventionen: Destruktive Tools (delete_*, uninstall_extension, cancel_cluster_upgrade, update_theme_content, update_theme_settings, restart_cluster_instances) erfordern confirm=true. update_theme_settings schaltet exact_theme_names für den Arbeitsbereich ein oder aus; der API-Schlüssel des Aufrufers muss für einen Arbeitsbereichsbesitzer oder -administrator erstellt worden sein, sonst erhält er 403, selbst mit themes:write. Das Einschalten verschiebt vorhandene Themes im Hintergrund auf ihre exakten bereitgestellten Namen; ein Theme, dessen Inhalt unter seinem exakten Namen ersetzt wurde, meldet restart_required: true von get_theme/list_themes/update_theme_content, bis restart_cluster_instances die Keycloak-Instanzen dieses Clusters neu startet. Ein Neustart kann auf das Wartungsfenster des Clusters verschoben werden, anstatt sofort angewendet zu werden, gemeldet als deferred: true und, wenn bekannt, next_window. create_cluster ist asynchron: Pollen Sie get_cluster, bis der Cluster available ist. create_domain gibt die DNS-Einträge zurück, die der Kunde erstellen muss; verify_domain löst eine DNS-Prüfung aus. set_theme_assignment aktiviert ein benutzerdefiniertes Theme pro Keycloak-Theme-Typ (leere Zeichenfolge setzt auf die integrierte Standardeinstellung zurück). update_theme_content ersetzt das Archiv eines Themes an Ort und Stelle (Base64-ZIP oder Keycloakify-JAR in content_base64), wobei die ID, der Name sowie die Realm- und Anwendungszuordnungen des Themes erhalten bleiben, sodass das Bearbeiten eines Themes nicht mehr das Löschen und erneute Hochladen bedeutet; es erfordert confirm=true, da das Archiv, das es überschreibt, nicht wiederherstellbar ist, und update_theme ändert weiterhin nur Name, Beschreibung und Version. Siehe docs/theme-content-update.md für die Durchführung dieses Aufrufs. update_cluster_security lässt CAPTCHA-Einstellungen unberührt. Der Realm-Import/-Export verschiebt die Konfiguration eines Realms und ist getrennt von create_export, das die Datenbank eines gesamten Clusters sichert: Beide sind asynchron, und das Realm-Archiv ist immer verschlüsselt, sodass das Passwort, das zum Exportieren verwendet wurde, zum erneuten Importieren benötigt wird. Ein Realm kann direkt aus einem vorhandenen Export importiert werden (source_export_id) oder aus einem hochgeladenen Archiv (create_realm_import_upload_url, PUT, dann upload_s3_key); das Importieren erstellt einen Realm und verweigert eine Namenskollision, anstatt zu überschreiben, und erfordert confirm=true, da es Benutzer und Anmeldedaten mitbringt.
Prompts
Acht Prompts geben Ihnen einen Ausgangspunkt in diese Tool-Oberfläche. Clients zeigen sie als Schrägstrichbefehle oder vorgeschlagene Aktionen an; jeder nimmt Argumente (Realm, Cluster, Zeitfenster) und führt das Modell in der richtigen Reihenfolge durch die richtigen Tools.
| Prompt | Was er tut |
|---|---|
audit_self_registration | Finden Sie jeden Realm, der weiterhin Selbstregistrierung erlaubt, über einen Cluster oder alle |
review_upgrades | Erkennen Sie Cluster, die bei ihrer Keycloak-Version im Rückstand sind, und legen Sie den Upgrade-Pfad dar |
triage_failed_logins | Rufen Sie kürzlich fehlgeschlagene Anmeldungen für einen Realm ab und gruppieren Sie sie nach Quell-IP |
review_identity_providers | Listen Sie die SSO-Verbindungen eines Realms auf und prüfen Sie, ob eine bestimmte aktiviert ist |
review_admin_changes | Zeigen Sie, wer kürzlich was in einem Realm geändert hat, mit Fokus auf Anmelde- und Sicherheitseinstellungen |
provision_environment | Erstellen Sie einen Cluster, fügen Sie einen Realm hinzu und richten Sie einen Identitätsanbieter ein, wobei jeder Schritt bestätigt wird |
set_up_custom_domain | Fügen Sie eine benutzerdefinierte Domain hinzu, geben Sie die genauen DNS-Einträge zurück, verifizieren Sie und leiten Sie sie an einen Realm weiter |
rotate_client_secret | Generieren Sie das Client-Geheimnis einer Anwendung neu, wobei der Auswirkungsbereich zuerst klar dargelegt wird |
Prompts sind auf dieselbe Weise gesteuert wie die Tools, die sie benennen: Die drei, die mutieren, werden nur Sitzungen angeboten, die die Schreib-Tools aufrufen könnten, auf die sie verweisen, und ihre Anweisungen sagen dem Modell, mit Ihnen zu bestätigen, bevor es etwas ändert. Die confirm=true-Anforderung für destruktive Tools gilt weiterhin zusätzlich.
Skills
Wo ein Prompt ein Ausgangspunkt ist, ist eine Skill ein vollständiges operatives Playbook, das das Modell bei Bedarf lädt. Der Server liefert vier, bereitgestellt über die Entwurfs-SEP-2640 Skills-Erweiterung: Er deklariert io.modelcontextprotocol/skills in seinen Fähigkeiten, antwortet auf skills/list und skills/get und stellt jede SKILL.md als gewöhnliche Ressource unter skill://<name>/SKILL.md mit einem sha256-Digest in seinem Listeneintrag bereit. Das Plugin-Verzeichnis von OpenAI importiert Skills in genau dieser Form.
| Skill | Was er kodiert |
|---|---|
auth-incident-triage | Triage bei „Benutzer können sich nicht anmelden“: Plattformausfälle von Angriffen und Konfigurationsänderungen unterscheiden, mithilfe von Ereignissen, WAF-Protokollen und Cluster-Gesundheit. Nur lesend |
enterprise-sso-rollout | Ein Enterprise-IdP Ende-zu-Ende in einen Realm einbinden: Issuer-Validierung, die Upstream-App-Registrierung, Broker-Konfiguration, Verbindungstest und Verifizierung anhand echter Anmeldeereignisse |
keycloak-migration-doctor | Einen Keycloak-Export, -Import oder eine Migration gegen die Blocker prüfen, die der Support tatsächlich sieht (Skript-Richtlinien, den Legacy-/auth-Pfad, Teil-Export-Erwartungen), und einen fehlgeschlagenen Job diagnostizieren, indem die echte error_message gelesen wird, statt der generischen Dashboard-Meldung |
keycloak-upgrade-readiness | Versionsabweichungen bewerten, herausfinden, was die neue Keycloak-Version bricht (Erweiterungen, Themes), und die Einführung über Umgebungen hinweg sequenzieren, mit einem Export als Rollback-Plan |
Skills unterliegen derselben Zugriffssteuerung wie die Tools, die sie benennen: Die drei Workflows, die um Schreib-Tools herum aufgebaut sind, werden in Nur-Lese-Sitzungen zurückgehalten, und einer eingeschränkten Sitzung wird nur ein Skill angeboten, dessen Tools sie tatsächlich besitzt. Die Quellen liegen in internal/tools/skills/, ein Verzeichnis pro Skill, im Standardformat Agent Skills, sodass sie auch direkt in ein lokales Skills-Verzeichnis kopiert funktionieren.
Verbinden
Für gehostetes HTTP ist der einfachste Weg OAuth, das überhaupt keine Anmeldedaten benötigt:
claude mcp add --transport http skycloak https://mcp.skycloak.io
Der erste Aufruf öffnet Ihren Browser, Sie genehmigen auf der Skycloak-Anmeldeseite, und die Tools erscheinen. Wenn Sie zu mehr als einem Workspace gehören, benennen Sie den gewünschten:
claude mcp add --transport http skycloak "https://mcp.skycloak.io?workspace=<workspace-id>"
Andernfalls erstellen Sie einen API-Schlüssel im Skycloak-Dashboard und konfigurieren Ihren MCP-Client so, dass er ihn als Bearer-Token sendet:
claude mcp add --transport http skycloak https://mcp.skycloak.io --header "Authorization: Bearer sk_sc_XXX"
Dies fügt Folgendes zu .claude.json hinzu:
{
"mcpServers": {
"skycloak": {
"type": "http",
"url": "https://mcp.skycloak.io",
"headers": {
"Authorization": "Bearer sk_sc_XXX"
}
}
}
}
Für lokales stdio melden Sie sich einmal an und zeigen dann Ihren Client auf skycloak-mcp run:
skycloak-mcp init # one-time browser sign-in; stores a key in your keychain
Claude Desktop / Cursor (lokal, stdio):
{
"mcpServers": {
"skycloak": {
"command": "skycloak-mcp",
"args": ["run", "--transport", "stdio"]
}
}
}
Claude Code:
claude mcp add skycloak -- skycloak-mcp run --transport stdio
Für headless / CI (ohne Browser) überspringen Sie init und übergeben stattdessen den Schlüssel: Fügen Sie "env": { "SKYCLOAK_API_KEY": "sk_sc_..." } zur Konfiguration hinzu oder claude mcp add skycloak --env SKYCLOAK_API_KEY=sk_sc_... -- skycloak-mcp run --transport stdio.
Fügen Sie --allow-writes nur hinzu, wenn Sie Änderungen vornehmen möchten (Anmeldung mit skycloak-mcp init --allow-writes oder Verwendung eines schreibberechtigten Schlüssels).
Fügen Sie ?readonly=true zu einer gehosteten HTTP-URL hinzu, um für diese HTTP-Sitzung nur Lese-Tools verfügbar zu machen, oder ?readonly=false, um die schreibfähige Tool-Oberfläche anzufordern. Der Abfrageparameter standardmäßig auf false, aber Schreib-Tools werden nur registriert, wenn der Server mit --allow-writes gestartet wurde.
Fügen Sie ?workspace=<uuid> hinzu, um auszuwählen, auf welchen Workspace eine OAuth-Sitzung wirkt. Er wird nur benötigt, wenn Sie zu mehr als einem gehören; bei einem einzelnen Workspace wählt der Server ihn für Sie aus, und wenn Sie zu mehreren gehören und keinen benennen, schlägt die Verbindung mit einer Meldung fehl, die diese auflistet.
Ausführen des HTTP-Transports
skycloak-mcp run --transport http --http-addr :8080
Er benötigt keine eigenen Anmeldedaten: Aufrufer liefern ihre pro Anfrage, sodass zur Bereitstellungszeit nichts injiziert wird. GET /healthz und GET /readyz sind nicht authentifiziert und melden nur, dass der Prozess läuft; sie testen bewusst nicht die Skycloak-API, sodass ein vorgelagerter Ausfall nicht alle Replica-Proben gleichzeitig scheitern lässt. Der Server hält keinen Sitzungszustand, sodass Replicas keine Sitzungsaffinität benötigen und frei skaliert oder gerollt werden können. SIGTERM stoppt neue Verbindungen und lässt laufende Aufrufe auslaufen.
Der OAuth-Pfad ist immer aktiv, wenn SKYCLOAK_ISSUER und SKYCLOAK_DASHBOARD_URL gesetzt sind, was standardmäßig der Fall ist. GET /.well-known/oauth-protected-resource wird dann ohne Authentifizierung bereitgestellt und benennt den Realm als Autorisierungsserver. Sein resource-Wert wird aus SKYCLOAK_PUBLIC_URL übernommen, wenn gesetzt, andernfalls aus dem Host und Schema der Anfrage selbst, sodass eine Einzelhost-Bereitstellung hinter einem Ingress keine zusätzliche Konfiguration benötigt. Das Schema stammt aus X-Forwarded-Proto, wenn vorhanden, und standardmäßig sonst https für alles außer einem Loopback-Host, da TLS vorgelagert terminiert und die Veröffentlichung einer http://-Kennung nicht der URL entsprechen würde, mit der der Client verbunden war. Setzen Sie SKYCLOAK_PUBLIC_URL, wenn Ihr Ingress Host umschreibt. Das Dokument listet auch openid profile email als sein scopes_supported auf, und die WWW-Authenticate-Herausforderung wiederholt sie als scope-Parameter, sodass ein Client, der eines von beiden liest, den Realm danach fragt: openid ist erforderlich, weil der Token-Austausch das Dashboard dazu bringt, den Userinfo-Endpunkt von Keycloak aufzurufen, und Keycloak ein Token verweigert, das ohne es gewährt wurde. Ein Token, das ohne es ankommt, wird bei der Verifizierung mit einem 401 und der Herausforderung abgelehnt, statt zu einem Austausch getragen zu werden, der nicht gelingen kann, sodass ein Client, der noch eine Gewährung von zuvor hält, aufhört, es erneut zu versuchen, und sich erneut anmeldet. Das Leeren einer der Issuer- oder Dashboard-Variablen schaltet OAuth vollständig aus, und der Server fordert wieder nur einen API-Schlüssel und sonst nichts.
OPENAI_APPS_CHALLENGE_TOKEN dient dem Verifizierungstoken des Plugin-Verzeichnisses von OpenAI unter /.well-known/openai-apps-challenge, als Klartext und sonst nichts. Wenn nicht gesetzt, ist die Route nicht registriert und der Pfad gibt 404 zurück.
Der Start protokolliert eine Zeile mit der aufgelösten Verdrahtung (oauth=, issuer=, dashboard=, public_url=, endpoint=, allow_writes=), sodass eine falsch konfigurierte Bereitstellung ohne erneutes Bereitstellen erkannt werden kann. Jede Anfrage, die auf dem OAuth-Pfad abgelehnt wird, protokolliert eine Zeile, die die fehlgeschlagene Stufe benennt (verify, exchange oder scopes), den Status, den der Aufrufer erhielt, und den zugrunde liegenden Fehler. Ein Verifizierungsfehler fügt die Prüfung hinzu, die das Token abgelehnt hat (expired, wrong_issuer, bad_signature, unknown_key_id, wrong_token_type, no_openid_scope und so weiter); ein Austauschfehler fügt den Status des Dashboards und den aufgerufenen Host hinzu. Der Aufrufer erscheint als Subjekt des Tokens, sobald es verifiziert ist, und nie als Anmeldedaten: das Zugriffstoken, der Authorization-Header und der gemünzte API-Schlüssel werden nie protokolliert.
Konfiguration
| Env-Var | Standard |
|---|---|
SKYCLOAK_API_KEY | keine (optional für stdio; HTTP-Clients stellen stattdessen API-Key-Header bereit) |
SKYCLOAK_ENDPOINT | https://api.skycloak.io |
SKYCLOAK_API_VERSION | aktuelle API-Version |
SKYCLOAK_ISSUER | https://login.app.skycloak.io/realms/skycloak (CLI-Anmeldung und der Autorisierungsserver, gegen den der HTTP-Transport Token verifiziert) |
SKYCLOAK_CLIENT_ID | skycloak-mcp (nur CLI-Gerätefluss) |
SKYCLOAK_DASHBOARD_URL | https://app.skycloak.io (münzt CLI-Schlüssel und HTTP-Sitzungsschlüssel) |
SKYCLOAK_PUBLIC_URL | keine (aus jeder Anfrage abgeleitet; setzen Sie es, wenn der Ingress Host umschreibt) |
OPENAI_APPS_CHALLENGE_TOKEN | Dient dem Verifizierungstoken des Plugin-Verzeichnisses von OpenAI unter /.well-known/openai-apps-challenge. Wenn nicht gesetzt, gibt dieser Pfad 404 zurück. |
Befehle: init (Browser-Anmeldung), run (bereitstellen), logout (gespeicherten Schlüssel entfernen). init akzeptiert --workspace <id>, --allow-writes, --allow-credentials und --ttl-days (Standard 90).
| Flag | Standard | Beschreibung |
|---|---|---|
--transport | stdio | stdio oder http |
--http-addr | :8080 | Listen-Adresse für den HTTP-Transport |
--allow-writes | false | mutierende Tools für stdio aktivieren und HTTP-Sitzungen mit readonly=false erlauben, Schreib-Tools zu registrieren |
Entwicklung
make build # build the server binary
make test # unit tests
make run # run on stdio for local testing
make inspector # MCP Inspector against the local binary
make lint # golangci-lint
make generate # regenerate the API client from the OpenAPI spec
Der API-Client unter internal/apiclient wird aus der Skycloak-OpenAPI-Spezifikation mit oapi-codegen generiert.
Synchron mit der API bleiben
Der Client in internal/apiclient wird aus internal/apiclient/openapi.yaml mit oapi-codegen generiert; führen Sie make generate aus, um ihn zu aktualisieren. CI schlägt fehl, wenn der eingecheckte generierte Code von der Spezifikation abweicht. Anfragen werden bei 429/5xx mit Retry-After-bewusstem Backoff erneut versucht.
Verteilung
Veröffentlicht als GitHub-Binärdateien und ein ghcr.io/sky-cloak/skycloak-mcp-Container-Image bei jedem Tag und im MCP-Registry als io.skycloak/skycloak-mcp veröffentlicht. Die meisten Menschen brauchen keines von beiden: Der gehostete Server benötigt keine Installation.
Sicherheit
Bitte melden Sie Schwachstellen privat. Siehe SECURITY.md.
Mitwirkende
Gebaut bei Skycloak von Guilliano Molaire, Neville Omangi und Aphilas. Die Repository-Historie wurde beim Öffnen zusammengeführt, sodass das Commit-Protokoll nicht widerspiegelt, wer was geschrieben hat.
Lizenz
Apache-2.0. Die OpenAPI-Beschreibung in internal/apiclient/openapi.yaml wird aus der Skycloak-Plattform-API generiert und ist (c) Skycloak; sie ist hier enthalten, damit der Client generiert und verifiziert werden kann. Siehe NOTICE.