Skycloak

offiziell

MCP-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_upgrades und get_cluster_upgrade_path.

  • Realm-Bereitstellung — Erstellen Sie einen Staging-Realm auf einem bestimmten Cluster mit konfigurierten Identitätsanbietern, mithilfe von create_realm und create_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_users und query_events.

  • SIEM-Integrationssetup — Konfigurieren Sie ein Ziel, das Admin-Ereignisse an einen externen Webhook weiterleitet, mithilfe von create_siem_destination und test_siem_destination.

  • Theme-Inhaltsersetzung — Aktualisieren Sie das Archiv eines benutzerdefinierten Themes direkt, ohne dessen Zuweisungen zu verlieren, über update_theme_content mit 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_domain und verify_domain.

Dokumentation

skycloak-mcp

Smithery

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.io ohne Header. Der Server antwortet 401 mit 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> (oder API-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 als 401 beim 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 403 antworten 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 als 403 von der API auf.
  • Lokales stdio. Führen Sie skycloak-mcp init aus 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 logout entfernt 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.io lä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=true zur 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-writes gestartet.
  • Cluster-Anmeldedaten sind optional. get_cluster_credentials gibt die Keycloak-Admin-Anmeldedaten eines Clusters zurück, die ein Assistent, der den Schlüssel hält, dann sehen würde, daher fordert init diesen 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 mit skycloak-mcp init --allow-credentials an. 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 Server Retry-After an.

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.

BereichSchreibgeschütztSchreibend (--allow-writes)
Clusterlist_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_windowcreate_cluster, update_cluster, delete_cluster, cancel_cluster_upgrade, restart_cluster_instances, set_cluster_maintenance_window, delete_cluster_maintenance_window
Edge-Sicherheitget_cluster_security, list_cluster_captcha_domainsupdate_cluster_security, add_cluster_captcha_domain, remove_cluster_captcha_domain
Realmslist_realms, get_realmcreate_realm, update_realm, delete_realm
Anwendungenlist_applications, get_application, list_application_roles, list_application_sessionscreate_application, update_application, delete_application, assign_application_role, remove_application_role, rotate_application_secret
Identitätsanbieterlist_identity_providers, get_identity_provider, list_identity_provider_templates, discover_oidccreate_identity_provider (OIDC), update_identity_provider, delete_identity_provider, test_identity_provider
Benutzer, Rollen & Gruppenlist_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_groupscreate_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 Domainslist_domains, get_domain, list_domain_routes, get_domain_routecreate_domain, verify_domain, delete_domain, create_domain_route, update_domain_route, delete_domain_route
Branding & Themeslist_themes, get_theme, get_theme_assignment, get_client_theme_assignment, get_login_branding, get_email_branding, download_theme_content, get_theme_settingsset_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
Erweiterungenlist_extensions, list_cluster_extensionsinstall_extension, upgrade_extension, update_extension, uninstall_extension, delete_extension
SMTPget_smtpupsert_smtp, delete_smtp, test_smtp
Exporte & Protokollelist_exports, get_export, get_logs, get_security_logs, query_eventscreate_export, delete_export, export_cluster_events
Realm-Import & -Exportget_realm_export, get_realm_importcreate_realm_export, create_realm_import, create_realm_import_upload_url
SIEMlist_siem_destinations, get_siem_destinationcreate_siem_destination, update_siem_destination, delete_siem_destination, test_siem_destination
Webhookslist_webhook_event_types, list_webhook_subscriptions, get_webhook_subscriptioncreate_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.

PromptWas er tut
audit_self_registrationFinden Sie jeden Realm, der weiterhin Selbstregistrierung erlaubt, über einen Cluster oder alle
review_upgradesErkennen Sie Cluster, die bei ihrer Keycloak-Version im Rückstand sind, und legen Sie den Upgrade-Pfad dar
triage_failed_loginsRufen Sie kürzlich fehlgeschlagene Anmeldungen für einen Realm ab und gruppieren Sie sie nach Quell-IP
review_identity_providersListen Sie die SSO-Verbindungen eines Realms auf und prüfen Sie, ob eine bestimmte aktiviert ist
review_admin_changesZeigen Sie, wer kürzlich was in einem Realm geändert hat, mit Fokus auf Anmelde- und Sicherheitseinstellungen
provision_environmentErstellen 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_domainFü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_secretGenerieren 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.

SkillWas er kodiert
auth-incident-triageTriage 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-rolloutEin 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-doctorEinen 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-readinessVersionsabweichungen 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-VarStandard
SKYCLOAK_API_KEYkeine (optional für stdio; HTTP-Clients stellen stattdessen API-Key-Header bereit)
SKYCLOAK_ENDPOINThttps://api.skycloak.io
SKYCLOAK_API_VERSIONaktuelle API-Version
SKYCLOAK_ISSUERhttps://login.app.skycloak.io/realms/skycloak (CLI-Anmeldung und der Autorisierungsserver, gegen den der HTTP-Transport Token verifiziert)
SKYCLOAK_CLIENT_IDskycloak-mcp (nur CLI-Gerätefluss)
SKYCLOAK_DASHBOARD_URLhttps://app.skycloak.io (münzt CLI-Schlüssel und HTTP-Sitzungsschlüssel)
SKYCLOAK_PUBLIC_URLkeine (aus jeder Anfrage abgeleitet; setzen Sie es, wenn der Ingress Host umschreibt)
OPENAI_APPS_CHALLENGE_TOKENDient 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).

FlagStandardBeschreibung
--transportstdiostdio oder http
--http-addr:8080Listen-Adresse für den HTTP-Transport
--allow-writesfalsemutierende 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.