Skycloak

by sky-cloak

Recommended SSE
172 downloads
Not rated
GitHub Website

About

Model Context Protocol server for Skycloak managed Keycloak. Manage clusters, realms, applications, SSO and users from any MCP client.

Details

Author
sky-cloak
Downloads
172
Transport
SSE
Categories
Developer Tools, Security

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Skycloak
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

{
  "mcpServers": {
    "skycloak": {
      "type": "http",
      "url": "https://mcp.skycloak.io"
    }
  }
}

skycloak_add_cluster_captcha_domain

Register a hostname for CAPTCHA protection on a cluster.

skycloak_add_realm_user_to_group

Add a user to a realm group.

skycloak_assign_application_role

Grant a role to an application's service account. Provide role_client_id for a client role, or omit it for a realm role.

skycloak_assign_realm_user_role

Assign a realm role to a user.

skycloak_cancel_cluster_upgrade

Cancel an in-progress cluster version upgrade. Set confirm=true to proceed.

skycloak_create_application

Create an OIDC/SAML client (application) in a realm. Returns the client secret for confidential clients (store it; it is not retrievable later).

skycloak_create_cluster

Provision a new Keycloak cluster. Asynchronous: the returned cluster starts in a provisioning state — poll skycloak_get_cluster until its status is 'available'. Requires --allow-writes.

skycloak_create_domain

Add a custom domain to a cluster. Returns the DNS records the customer must create to verify and route the domain.

skycloak_create_domain_route

Add a realm route to a custom domain.

skycloak_create_export

Start a database export for a cluster. Asynchronous: poll skycloak_get_export until the status is 'completed' to obtain the download URL. Including credentials requires an encryption_password.

skycloak_create_identity_provider

Create an OIDC identity provider (SSO connection) in a realm.

skycloak_create_realm

Create a new Keycloak realm in a cluster. Requires the server to be started with --allow-writes and a write-scoped API key.

skycloak_create_realm_export

Export a Keycloak realm to an encrypted archive. Asynchronous: poll skycloak_get_realm_export until status is 'completed'. The archive is always encrypted, so encryption_password is required, and the same password is needed to import it again. This is a realm export (one realm's configuration); skycloak_create_export is the separate whole-cluster database export.

skycloak_create_realm_group

Create a realm group, optionally nested under a parent group.

skycloak_create_realm_import

Import a Keycloak realm into a cluster from an uploaded archive or an existing realm export. Asynchronous: poll skycloak_get_realm_import. Creates a new realm: preflight refuses a name collision rather than overwriting, so an existing realm of the same name fails with 409. It does import users and their credentials, so set confirm=true to proceed.

skycloak_create_realm_import_upload_url

Get a presigned URL to upload a realm archive to. PUT the archive to upload_url, then pass the returned s3_key to skycloak_create_realm_import as upload_s3_key. Not needed when importing an existing export: pass that export's ID as source_export_id instead.

skycloak_create_realm_role

Create a realm-scoped role.

skycloak_create_realm_user

Create a realm user with an initial temporary password.

skycloak_create_siem_destination

Create a SIEM destination. Credentials are write-only and are not returned.

skycloak_create_webhook_subscription

Create a webhook subscription. Signing secrets and authorization headers are write-only.

skycloak_delete_application

Delete an application (OIDC/SAML client) from a realm. Set confirm=true to proceed.

skycloak_delete_cluster

Permanently delete a Keycloak cluster and all of its realms and data. Irreversible. Set confirm=true to proceed.

skycloak_delete_cluster_maintenance_window

Delete a cluster-specific maintenance window so the cluster follows the workspace default. Set confirm=true to proceed.

skycloak_delete_domain

Remove a custom domain from a cluster. Set confirm=true to proceed.

skycloak_delete_domain_route

Remove a realm route from a custom domain. Set confirm=true to proceed.

skycloak_delete_email_branding

Revert email branding to defaults. Set confirm=true to proceed.

skycloak_delete_export

Delete a database export archive. Set confirm=true to proceed.

skycloak_delete_extension

Delete a custom extension from the workspace catalog. Set confirm=true to proceed.

skycloak_delete_identity_provider

Delete an identity provider from a realm. Set confirm=true to proceed.

skycloak_delete_login_branding

Revert login branding to defaults. Set confirm=true to proceed.

skycloak_delete_realm

Permanently delete a realm and all of its users, clients and configuration. This is irreversible. Set confirm=true to proceed.

skycloak_delete_realm_group

Delete a realm group. Set confirm=true to proceed.

skycloak_delete_realm_role

Delete a realm role. Set confirm=true to proceed.

skycloak_delete_realm_user

Delete a realm user. Set confirm=true to proceed.

skycloak_delete_siem_destination

Delete a SIEM destination. Set confirm=true to proceed.

skycloak_delete_smtp

Remove a realm's SMTP configuration. Set confirm=true to proceed.

skycloak_delete_theme

Delete a custom theme. Set confirm=true to proceed.

skycloak_delete_webhook_subscription

Delete a webhook subscription. Set confirm=true to proceed.

skycloak_discover_oidc

Resolve an OIDC issuer's discovery document to obtain its authorization, token, and userinfo endpoints. Use the result when creating an identity provider.

skycloak_download_theme_content

Download a custom theme's content archive. Returns size and SHA-256 always, and the archive itself only when it is small enough to inline.

skycloak_export_cluster_events

Export a cluster's events as a document and return its contents.

skycloak_get_application

Get an application (OIDC/SAML client) by client ID.

skycloak_get_client_theme_assignment

Get a client's login-theme override (empty means the realm default).

skycloak_get_cluster

Get full details for a single Keycloak cluster by its ID.

skycloak_get_cluster_insights

Get cluster analytics as a JSON document. type is one of: overview, authentication, events, performance, security.

skycloak_get_cluster_maintenance_window

Get a cluster-specific maintenance window. A 404 means the cluster follows the workspace default.

skycloak_get_cluster_security

Get a cluster's edge-security configuration: IP allow-listing, rate limiting, WAF, geo-blocking, and bot management.

skycloak_get_cluster_upgrade_path

Get the recommended version-upgrade path for a cluster.

skycloak_get_domain

Get a custom domain by ID, including its DNS records and verification/SSL status.

skycloak_get_domain_route

Get a single realm route on a custom domain.

skycloak_get_email_branding

Get the email-template branding (colors, logo, footer) for a realm.

skycloak_get_export

Get a database export job by ID, including its status, progress, and (once completed) the time-limited download URL.

skycloak_get_identity_provider

Get an identity provider by provider ID.

skycloak_get_login_branding

Get the login-page branding (colors, logo, toggles) for a realm.

skycloak_get_logs

Read recent Keycloak server logs for a cluster, optionally filtered by level and a search string.

skycloak_get_realm

Get a realm by name.

skycloak_get_realm_export

Get a realm export job by ID. Poll this after skycloak_create_realm_export until status is 'completed'; the download URL only appears then and expires 24 hours later.

skycloak_get_realm_group

Get a realm group by ID.

skycloak_get_realm_import

Get a realm import job by ID. Poll this after skycloak_create_realm_import until status is 'completed' or 'failed'.

skycloak_get_realm_role

Get a realm role by name.

skycloak_get_realm_user

Get a realm user by ID.

skycloak_get_security_logs

Read recent security (WAF) logs for a cluster — blocked requests, attack types, source IPs.

skycloak_get_siem_destination

Get a SIEM destination by ID.

skycloak_get_smtp

Get a realm's SMTP configuration (secret values are never returned).

skycloak_get_theme

Get a custom theme by ID.

skycloak_get_theme_assignment

Get the active custom theme per Keycloak theme type (login, account, admin, email) for a realm.

skycloak_get_webhook_subscription

Get a webhook subscription by ID.

skycloak_install_extension

Install a catalog extension on a cluster. Installation is asynchronous; poll skycloak_list_cluster_extensions until the status settles. Provide required parameters keyed by parameter name.

skycloak_list_application_roles

List the roles assigned to an application's service account.

skycloak_list_application_sessions

List active user sessions for an application.

skycloak_list_applications

List the OIDC/SAML clients (applications) in a realm.

skycloak_list_cluster_captcha_domains

List hostnames registered for CAPTCHA protection on a cluster.

skycloak_list_cluster_extensions

List the extensions currently installed on a cluster, with their version and upgrade status.

skycloak_list_cluster_features

List the Keycloak feature flags available to tenant clusters.

skycloak_list_cluster_locations

List the deployment regions available to the workspace.

skycloak_list_cluster_types

List the cluster types the workspace can provision.

skycloak_list_cluster_upgrades

List the version-upgrade history for a cluster.

skycloak_list_cluster_versions

List the Keycloak versions available for a cluster type.

skycloak_list_clusters

List the Keycloak clusters in your Skycloak workspace, with their status, type, size, version and location.

skycloak_list_domain_routes

List the realm routes configured on a custom domain.

skycloak_list_domains

List the custom domains configured on a cluster.

skycloak_list_exports

List the database export jobs for a cluster, with their status and expiry.

skycloak_list_extensions

List the extension catalog available to the workspace (marketplace extensions that can be installed on a cluster).

skycloak_list_identity_provider_templates

List the pre-configured identity-provider templates. Use a template id when creating a provider.

skycloak_list_identity_providers

List the identity providers (SSO connections) in a realm.

skycloak_list_realm_group_members

List the users that belong to a realm group.

skycloak_list_realm_groups

List the top-level groups in a realm.

skycloak_list_realm_roles

List the realm-scoped roles in a realm.

skycloak_list_realm_users

List the users in a realm.

skycloak_list_realms

List the Keycloak realms in a Skycloak cluster.

skycloak_list_siem_destinations

List SIEM destinations configured for the workspace.

skycloak_list_themes

List the custom themes uploaded to a cluster, with their IDs, status, and theme types.

skycloak_list_user_groups

List the groups a user belongs to.

skycloak_list_user_roles

List the realm roles assigned to a user.

skycloak_list_webhook_event_types

List webhook event types. Optionally filter by source: platform or keycloak.

skycloak_list_webhook_subscriptions

List webhook subscriptions. Optionally filter by source, cluster_id, and enabled.

skycloak_query_events

Query Keycloak user and admin events for a cluster (logins, token grants, admin operations), filterable by category, realm, username and search.

skycloak_remove_application_role

Remove a role from an application's service account.

skycloak_remove_cluster_captcha_domain

Remove a hostname from CAPTCHA protection on a cluster. Set confirm=true to proceed.

skycloak_remove_realm_user_from_group

Remove a user from a realm group.

skycloak_remove_realm_user_role

Remove a realm role from a user.

skycloak_rotate_application_secret

Regenerate an application's client secret and return the new value (shown only once).

skycloak_set_client_theme_assignment

Set a client's login-theme override. Pass a theme ID, or an empty string to reset to the realm default.

skycloak_set_cluster_maintenance_window

Create or replace a cluster-specific maintenance window.

skycloak_set_theme_assignment

Assign custom themes to a realm per Keycloak theme type. Pass a theme ID to activate it, or an empty string to reset that type to Keycloak's built-in default. Only the provided fields are changed.

skycloak_test_identity_provider

Test connectivity to an identity provider, optionally overriding the client credentials for this test only.

skycloak_test_siem_destination

Send a test event to a SIEM destination.

skycloak_test_smtp

Send a test email through a realm's configured SMTP server to verify delivery.

skycloak_test_webhook_subscription

Send a test event to a webhook subscription.

skycloak_uninstall_extension

Uninstall an extension from a cluster. Set confirm=true to proceed.

skycloak_update_application

Update an application's name, description, or redirect URIs.

skycloak_update_cluster

Update a cluster's version (to trigger an upgrade) or size.

skycloak_update_cluster_security

Update a cluster's edge-security configuration. Only the sections you provide are changed; CAPTCHA settings are preserved. Supports IP allow-listing, rate limiting, WAF, geo-blocking, and bot management.

skycloak_update_domain_route

Update a domain route's admin access and CORS origins.

skycloak_update_extension

Update a custom extension's name or description.

skycloak_update_identity_provider

Update an identity provider's display name and enabled state.

skycloak_update_realm

Update a realm's display name and enabled state.

skycloak_update_realm_group

Rename a realm group.

skycloak_update_realm_role

Rename a realm role or change its description.

skycloak_update_realm_user

Update a realm user's profile (email, name, enabled, email_verified).

skycloak_update_siem_destination

Update a SIEM destination. Only provided fields are changed; credentials remain write-only.

skycloak_update_theme

Update a theme's name, description, or version.

skycloak_update_webhook_subscription

Update a webhook subscription. Use clear_authorization_header, clear_cluster_id, or clear_realm_id to remove nullable fields.

skycloak_upgrade_extension

Upgrade an installed extension to the latest available version. Asynchronous.

skycloak_upsert_email_branding

Create or update email-template branding (color, logo, footer).

skycloak_upsert_login_branding

Create or update login-page branding (colors, logo, registration toggle).

skycloak_upsert_smtp

Create or update a realm's SMTP configuration (basic auth).

skycloak_verify_domain

Trigger DNS verification for a custom domain and return its updated status.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "skycloak": {
            "skycloak": {
                "type": "http",
                "url": "https://mcp.skycloak.io"
            }
        }
    }
}

McpServers

{
    "skycloak": {
        "type": "http",
        "url": "https://mcp.skycloak.io"
    }
}

Manage your Skycloak (managed Keycloak) clusters, realms, and SSO from any MCP client.

- Cluster upgrade review— Ask which clusters are behind on Keycloak upgrades and get the upgrade path vialist_cluster_upgradesandget_cluster_upgrade_path.
- Realm provisioning— Create a realm with Google and GitHub sign-in usingcreate_realmandcreate_identity_provider.
- SIEM forwarding— Set up a SIEM destination that forwards admin events to a Datadog webhook viacreate_siem_destination.
- Custom domain setup— Add a custom domain, get DNS records, and verify withcreate_domainandverify_domain.

OfficialModel Context Protocolserver forSkycloak(managed Keycloak): manage your clusters, realms, applications, and SSO from any MCP client (Claude Desktop, Claude Code, Cursor).

Status:early release. Tool coverage is growing; see the changelog for what's available.

claude mcp add --transport http skycloak https://mcp.skycloak.io

- "Which of my Keycloak clusters are behind on upgrades?"
- "Create a staging realm on the EU cluster with Google and GitHub sign-in."
- "Who was added to the production realm in the last week?"
- "Set up a SIEM destination that forwards admin events to our Datadog webhook."

129 tools: 58 read-only and 71 write. Read-only tools are always available. On the hosted server the write tools are registered too and gated by your credential's scopes; the local binary registers them only when started with--allow-writes.

Tool names carry askycloak_prefix that the table below omits, solist_clustersisskycloak_list_clustersin your client.

Conventions:destructive tools (delete_*,uninstall_extension,cancel_cluster_upgrade) requireconfirm=true.create_clusteris asynchronous: pollget_clusteruntil the cluster isavailable.create_domainreturns the DNS records the customer must create;verify_domaintriggers a DNS check.set_theme_assignmentactivates a custom theme per Keycloak theme type (empty string resets to the built-in default).update_cluster_securityleaves CAPTCHA settings untouched. Realm import/export moves one realm's configuration and is separate fromcreate_export, which dumps a whole cluster's database: both are asynchronous, and the realm archive is always encrypted, so the password used to export it is needed to import it again. A realm can be imported straight from an existing export (source_export_id) or from an uploaded archive (create_realm_import_upload_url, PUT, thenupload_s3_key); importing creates a realm and refuses a name collision rather than overwriting, and needsconfirm=truebecause it brings users and credentials with it.

Eight prompts give you a starting point into that tool surface. Clients surface them as slash commands or suggested actions; each one takes arguments (realm, cluster, time window) and walks the model through the right tools in the right order.

Prompts are gated the same way as the tools they name: the three that mutate are only offered to sessions that could call the write tools they reference, and their instructions tell the model to confirm with you before changing anything. Theconfirm=truerequirement on destructive tools still applies on top.

Where a prompt is a starting point, a skill is a full operational playbook the model loads on demand. The server ships four, served over the draftSEP-2640 Skills extension: it declaresio.modelcontextprotocol/skillsin its capabilities, answersskills/listandskills/get, and serves eachSKILL.mdas an ordinary resource atskill://<name>/SKILL.mdwith a sha256 digest in its listing entry. OpenAI's plugin directory imports skills in exactly this shape.

Skills follow the same gating as the tools they name: the three workflows built around write tools are withheld from read-only sessions, and a scoped session is only offered a skill whose tools it actually has. The sources live ininternal/tools/skills/, one directory per skill, in the standardAgent Skillsformat, so they also work copied straight into a local skills directory.

For hosted HTTP the simplest route is OAuth, which needs no credential at all:

claude mcp add --transport http skycloak https://mcp.skycloak.io

The first call opens your browser, you approve in the Skycloak login page, and the tools appear. If you belong to more than one workspace, name the one you want:

claude mcp add --transport http skycloak "https://mcp.skycloak.io?workspace=<workspace-id>"

Otherwise, create an API key in the Skycloak dashboard and configure your MCP client to send it as a bearer token:

claude mcp add --transport http skycloak https://mcp.skycloak.io --header "Authorization: Bearer sk_sc_XXX"

This adds the following to.claude.json:

{ "mcpServers": { "skycloak": { "type": "http", "url": "https://mcp.skycloak.io", "headers": { "Authorization": "Bearer sk_sc_XXX" } } } }
skycloak-mcp init # one-time browser sign-in; stores a key in your keychain
{ "mcpServers": { "skycloak": { "command": "skycloak-mcp", "args": ["run", "--transport", "stdio"] } } }
claude mcp add skycloak -- skycloak-mcp run --transport stdio

For headless / CI (no browser), skipinitand pass the key instead: add"env": { "SKYCLOAK_API_KEY": "sk_sc_..." }to the config, orclaude mcp add skycloak --env SKYCLOAK_API_KEY=sk_sc_... -- skycloak-mcp run --transport stdio.

Add?readonly=trueto a hosted HTTP URL to expose only read-only tools for that HTTP session, or?readonly=falseto request the write-capable tool surface. The query parameter defaults tofalse, but write tools are registered only when the server was started with--allow-writes.

Add?workspace=<uuid>to pick which workspace an OAuth session acts on. It is only needed when you belong to more than one; with a single workspace the server picks it for you, and if you belong to several and name none, the connection fails with a message listing them.

skycloak-mcp run --transport http --http-addr :8080

It needs no credential of its own: callers supply theirs per request, so nothing is injected at deploy time.GET /healthzandGET /readyzare unauthenticated and report only that the process is up; they deliberately do not probe the Skycloak API, so an upstream blip cannot fail every replica's probe at once. The server holds no session state, so replicas need no session affinity and can be scaled or rolled freely.SIGTERMstops new connections and drains in-flight calls.

The OAuth path is on wheneverSKYCLOAK_ISSUERandSKYCLOAK_DASHBOARD_URLare set, which they are by default.GET /.well-known/oauth-protected-resourceis then served unauthenticated, naming the realm as the authorization server. Itsresourcevalue is taken fromSKYCLOAK_PUBLIC_URLwhen set, and otherwise from the request's ownHostand scheme, so a single-host deployment behind an ingress needs no extra configuration. The scheme comes fromX-Forwarded-Protowhen present, and otherwise defaults tohttpsfor anything but a loopback host, since TLS terminates upstream and publishing anhttp://identifier would not match the URL the client connected on. SetSKYCLOAK_PUBLIC_URLif your ingress rewritesHost. The document also listsopenid profile emailas itsscopes_supported, and theWWW-Authenticatechallenge repeats them as ascopeparameter, so a client reading either one asks the realm for them:openidis required, because the token exchange makes the dashboard call Keycloak's userinfo endpoint and Keycloak refuses a token granted without it. A token that arrives without it is refused at verification with a401and the challenge, rather than carried to an exchange that cannot succeed, so a client still holding a grant from before stops retrying and signs in again. Blanking either of the issuer or dashboard variables turns OAuth off entirely, and the server goes back to challenging for an API key and nothing else.

OPENAI_APPS_CHALLENGE_TOKENserves OpenAI's plugin-directory domain verification token at/.well-known/openai-apps-challenge, as plain text and nothing else. Unset, the route is not registered and the path 404s.

Startup logs one line with the wiring it resolved (oauth=,issuer=,dashboard=,public_url=,endpoint=,allow_writes=), so a misconfigured deployment can be spotted without a redeploy. Every request refused on the OAuth path logs one line naming the stage that failed (verify,exchangeorscopes), the status the caller got, and the underlying error. A verification failure adds the check that rejected the token (expired,wrong_issuer,bad_signature,unknown_key_id,wrong_token_type,no_openid_scope, and so on); an exchange failure adds the dashboard's status and the host called. The caller appears as the token's subject once it is verified, and never as a credential: the access token, theAuthorizationheader and the minted API key are never logged.

Commands:init(browser sign-in),run(serve),logout(remove the stored key).initaccepts--workspace <id>,--allow-writes,--allow-credentials, and--ttl-days(default 90).

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

The API client underinternal/apiclientis generated from the Skycloak OpenAPI specification withoapi-codegen.

The client ininternal/apiclientis generated frominternal/apiclient/openapi.yamlwithoapi-codegen; runmake generateto refresh it. CI fails if the committed generated code drifts from the spec. Requests are retried on429/5xxwithRetry-After-aware backoff.

Released as GitHub binaries and aghcr.io/sky-cloak/skycloak-mcpcontainer image on each tag, and published to theMCP Registryasio.skycloak/skycloak-mcp. Most people do not need either: the hosted server needs no install.

Please report vulnerabilities privately. SeeSECURITY.md.

Built atSkycloakby Guilliano Molaire, Neville Omangi and Aphilas. The repository history was squashed when it was opened up, so the commit log does not reflect who wrote what.

Apache-2.0. The OpenAPI description ininternal/apiclient/openapi.yamlis generated from the Skycloak platform API and is (c) Skycloak; it is included here so the client can be generated and verified. SeeNOTICE.

This is a web browser that enables your coding agent, such as Claude Code, to visit websites on your behalf and assist you in identifying bugs or creating UI test cases.

The first MCP server governed by ICA. A remote streamable HTTP server at https://mcp.aleeth.com/mcp with 37 governed tools: every call is risk-checked by Rail Guard before it runs and sealed with a signed Ed25519 receipt on a hash-chained public ledger anchored to Bitcoin. Fails closed: no receipt, no response. OAuth 2.0 with RFC 9728 discovery; anonymous requests get 401. This repository is the public interface and provenance record: a generated tool manifest with per-tool annotations, an SBOM and vulnerability scan with digested provenance, and a TRUST.md of verify-it-yourself commands. The implementation is private by design. Independent probe grade A from mcp-spec-check, re-verified 2026-07-24.

Turn any OpenAPI spec into a hosted MCP server in 30 seconds. One typed tool per endpoint, server-side auth injection, stable URL across spec updates. EU-hosted, GDPR-native.

Discover powerful AI agents, invoke them instantly, and verify every result with Ed25519 cryptographic proofs. Nine tools — five free, four billed — all protected by OAuth 2.1.

AI-safe approval plan gated Kubernetes operations through MCP with OAuth, RBAC, audit, guardrails.

A remote MCP server with GitHub OAuth authentication and built-in analytics tracking.

A local MCP server that breaks on demand. Test your client against auth failures, disappearing tools, flaky responses, and token expiry, all from a web UI.

An MCP server with built-in GitHub OAuth support, deployable on Cloudflare Workers.

An MCP server with built-in GitHub OAuth support, designed for deployment on Cloudflare Workers.

Hosted mock-API MCP server: agents create live REST/GraphQL mock APIs, import OpenAPI/CSV/db.json, seed fake data, query and write records — free, no auth, stateless Streamable HTTP.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.