mcp-keycloak
With this server you can inspect and search Keycloak realms, users, clients, roles, and groups in a read-only fashion.
List all visible realms and fetch settings for a specific realm.
List and search users in a realm with free-text search and pagination, get a user by Keycloak UUID, and count users matching a search.
List OAuth/OIDC clients in a realm, optionally filtered by clientId.
List realm-level roles.
List groups in a realm, optionally filtered by search.
Secrets and passwords are never returned by Keycloak.
Provides tools for inspecting and managing Keycloak realms, users, clients, roles, and groups, with configurable access modes and security controls.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-keycloaklist all users in the customers realm"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-keycloak
A Model Context Protocol server for Keycloak. It lets an MCP-capable client (Claude Desktop, Claude Code, etc.) inspect and manage Keycloak realms, users, clients, roles, and groups — with security controlled entirely by flags.
The design goal is safe by default: it starts read-only, scopes to an allowlist of realms, protects sensitive realms from mutation, and gates destructive operations behind an explicit opt-in.
Features
Multi-realm — every tool takes a
realmargument; scope it with an allowlist.Access modes —
read-only→read-write→admin, layered so a mode never exposes tools above its level.Security flags — realm allowlist, protected realms, delete gating, dry-run, and JSON audit logging (see below).
Two auth strategies — confidential-client service account (recommended) or admin username/password.
Zero heavy dependencies — a thin fetch-based Admin REST client, plus the MCP SDK and zod.
Related MCP server: mcp-keycloak-admin
Security model
Concern | Flag | Default | Effect |
What can the server do at all? |
|
|
|
Which realms are in scope? |
| (all) | Comma-separated. When set, any operation on a realm outside the list is refused. |
Which realms are read-only forever? |
|
| Protected realms can be read but never mutated or deleted, regardless of mode. |
Can it delete? |
|
|
|
Preview without touching Keycloak |
|
| Write/admin tools validate + log intent, then return without calling Keycloak. |
Audit trail |
|
| Emits a JSON line to stderr per guarded operation ( |
Interactive confirmation | (automatic) | — | Destructive & high-impact actions prompt the human to approve via MCP elicitation before running; clients without elicitation fall back to the |
These layers are independent — for example admin mode with KEYCLOAK_ALLOW_DELETE=false can create and update users but cannot delete them.
Tools
Read (read-only+): list_realms, get_realm, list_users, get_user, count_users, list_clients, list_realm_roles, list_groups
Write (read-write+): create_user, update_user, reset_password, logout_user
Admin (admin): delete_user
Quickstart — add to your agent
Published on npm as @dockndevai/mcp-keycloak. No clone or build needed — your MCP client runs it on demand with npx. Start in read-only mode; see .env.example for every variable and docs/CLIENTS.md for the full per-client guide.
Claude Code (CLI)
claude mcp add keycloak -e KEYCLOAK_URL="https://keycloak.example.com" -e KEYCLOAK_CLIENT_ID="admin-cli" -e KEYCLOAK_CLIENT_SECRET="your-secret" -e KEYCLOAK_MODE="read-only" -- npx -y @dockndevai/mcp-keycloakClaude Desktop · Cursor · Windsurf — same block in claude_desktop_config.json, .cursor/mcp.json, or ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"keycloak": {
"command": "npx",
"args": [
"-y",
"@dockndevai/mcp-keycloak"
],
"env": {
"KEYCLOAK_URL": "https://keycloak.example.com",
"KEYCLOAK_CLIENT_ID": "admin-cli",
"KEYCLOAK_CLIENT_SECRET": "your-secret",
"KEYCLOAK_MODE": "read-only"
}
}
}
}OpenAI Codex CLI — in ~/.codex/config.toml:
[mcp_servers.keycloak]
command = "npx"
args = ["-y", "@dockndevai/mcp-keycloak"]
env = { KEYCLOAK_URL = "https://keycloak.example.com", KEYCLOAK_CLIENT_ID = "admin-cli", KEYCLOAK_CLIENT_SECRET = "your-secret", KEYCLOAK_MODE = "read-only" }VS Code (GitHub Copilot, Agent mode) — in .vscode/mcp.json:
{
"servers": {
"keycloak": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@dockndevai/mcp-keycloak"
],
"env": {
"KEYCLOAK_URL": "https://keycloak.example.com",
"KEYCLOAK_CLIENT_ID": "admin-cli",
"KEYCLOAK_CLIENT_SECRET": "your-secret",
"KEYCLOAK_MODE": "read-only"
}
}
}
}Configure
Copy .env.example and fill it in, or set the variables directly in your MCP client config. A confidential client with the realm-management roles you need is the recommended credential.
Run from source (development)
Prefer the published package above. To run from a clone:
npm install
npm run build
node dist/index.js # with the environment variables setDevelop
npm run dev # watch mode
npm test # unit tests for the security policy
npm run typecheckPublishing
This server ships a server.json for the official MCP registry and an mcpName for npm ownership validation. See PUBLISHING.md for publishing to npm and listing on the MCP registry, Smithery, Glama, Cursor, and PulseMCP.
License
MIT
Available Tools
8 toolscount_usersCount usersARead-onlyIdempotent
Return the number of users in a realm, optionally matching a search term.
| Name | Required | Description | Default |
|---|---|---|---|
| realm | Yes | Realm name | |
| search | No | Optional search term |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, covering the safety profile. The description adds that the result is a count rather than a collection, which is useful, but says nothing about performance, limits, or response shape beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no redundant or filler content; the scope (realm) precedes the optional modifier (search term).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only counting tool with full schema coverage and rich annotations, the description covers what an agent needs. A brief note that the return value is an integer count would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both realm and search are already documented in the schema. The description restates them (realm scope, optional search term) without adding format or matching semantics, which is the baseline case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ("Return the number of") and resource ("users in a realm"), which clearly distinguishes counting from retrieval. It does not explicitly name the sibling list_users as the alternative for full records, so it falls short of the 5 tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Optionally matching a search term" implies when to narrow the count, giving some usage context. However, it never states when to prefer this over list_users or get_user, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_realmGet realm settingsCRead-onlyIdempotent
Fetch the configuration of a single realm.
| Name | Required | Description | Default |
|---|---|---|---|
| realm | Yes | Realm name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered by structured fields. The description adds nothing beyond that: it doesn't say what 'configuration' includes, whether the realm must exist, or what happens for an unknown realm name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the action front-loaded and zero filler. It is appropriately sized, though its brevity stems partly from under-specification rather than economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with rich annotations, this is minimally adequate. But with no output schema, the description does not indicate what the returned 'configuration' comprises, leaving a gap the structured fields don't fill.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only one parameter and 100% schema description coverage, the schema already documents the 'realm' name parameter. The description adds no format, naming-convention, or default details beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('configuration of a single realm'), which is clear and unambiguous. However, it offers no differentiation from the sibling list_realms tool, leaving the agent to infer why a singular realm fetch exists alongside a list operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus list_realms or other siblings, no prerequisites, and no exclusions. The word 'single' weakly implies targeting one realm, but no usage condition is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_userGet user by idBRead-onlyIdempotent
Fetch a single user representation by their Keycloak id.
| Name | Required | Description | Default |
|---|---|---|---|
| realm | Yes | Realm name | |
| userId | Yes | Keycloak user id (UUID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds only that the result is a single user 'representation' looked up by id; it says nothing about behavior when the id is unknown (error vs empty) or about realm scoping. Some added value, but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence with zero filler, and the identifying constraint (by their Keycloak id) is front-loaded. Nothing needs trimming or reordering.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only lookup with full schema coverage, complete annotations, and no output schema to explain, the description is nearly sufficient. It could have noted the not-found behavior or the realm scoping requirement, but nothing essential blocks correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema fully documents both realm and userId (UUID). The description only echoes the Keycloak id concept already stated in the schema, adding no format, casing, or realm-relationship detail beyond it. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fetch), resource (user), and scope (a single user) keyed by Keycloak id, which cleanly separates it from the list_users/count_users siblings. It stops short of naming those siblings explicitly, so it is clear but not maximally differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no routing to alternatives such as list_users for enumeration or searching by attribute. The agent must infer from context that this is the point-lookup path rather than a filter path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_clientsList clientsARead-onlyIdempotent
List OAuth/OIDC clients configured in a realm. Client secrets are not included.
| Name | Required | Description | Default |
|---|---|---|---|
| realm | Yes | Realm name | |
| clientId | No | Filter by clientId |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is handled. The description adds a genuinely useful behavioral note beyond them: that client secrets are excluded from the results, which is security-relevant output context. It omits pagination/result-size behavior, keeping it out of the top score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the scope stated first and the exclusion note second; every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with no output schema, the description adequately tells the agent what is returned and what is withheld. Only minor gaps remain (ordering, pagination, or whether an empty realm yields an empty list).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both realm and clientId are already documented in the schema and the baseline is 3. The description adds no syntax, format, or matching semantics (e.g., exact vs partial match for clientId) beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (OAuth/OIDC clients configured in a realm), which is unambiguous and distinct from sibling resources like users, groups, and roles. It stops short of explicitly contrasting with any sibling (e.g., a hypothetical get_client), but no such sibling exists here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use or when-not-to-use guidance and names no alternatives. The only implicit scoping is the required realm parameter, which the schema already communicates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_groupsList groupsCRead-onlyIdempotent
List groups in a realm.
| Name | Required | Description | Default |
|---|---|---|---|
| realm | Yes | Realm name | |
| search | No | Optional search term |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered. The description adds only the realm scoping, which the schema already enforces as required, and says nothing about pagination, ordering, or result size limits for a list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with zero filler. It is efficient, though the brevity comes at the cost of the guidance the tool is missing rather than through tight editing of a richer description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with full schema coverage and annotation coverage, the description is minimally adequate. It omits pagination/limit behavior and any note on result shape, which matters for a list endpoint with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (realm, search) are documented in the schema, so the baseline is 3. The description adds no extra meaning about how 'search' matches or how results are scoped beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb (List) and resource (groups) plus its scope (in a realm), so an agent knows what it returns. It does not, however, differentiate itself from the many sibling list tools (list_users, list_clients, list_realm_roles) beyond the noun, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites or permissions, and no reference to alternatives or follow-up tools among the siblings. The agent is left to infer that this is the right list tool purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_realm_rolesList realm rolesCRead-onlyIdempotent
List the realm-level roles defined in a realm.
| Name | Required | Description | Default |
|---|---|---|---|
| realm | Yes | Realm name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered. The description adds only the scoping phrase 'defined in a realm' and says nothing about return size, ordering, or pagination, so it contributes little beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single lean sentence with the resource front-loaded after the verb and no filler. It is efficient, though bordering on under-specified rather than tightly packaged information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter list tool with rich annotations and no output schema, the definition is minimally viable. It omits whether the result is filtered, sorted, or paginated, which an agent might reasonably want to know before listing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema description coverage is 100% ('Realm name'), so the schema fully documents it. Baseline 3 applies; the description adds no format, casing, or defaulting detail beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (List) and resource (realm-level roles), scoped to a realm. It is distinguishable from list_users/list_groups/list_clients by resource noun, though it does not explicitly contrast itself with any sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus alternatives such as get_user or list_users, nor any condition or prerequisite. The realm parameter is required but nothing tells the agent when this listing is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_realmsList realmsARead-onlyIdempotent
List all realms visible to the configured credentials. Realms outside the allowlist are filtered out.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly, openWorld, idempotent, and non-destructive signals. The description adds useful context beyond those annotations by clarifying that only realms visible to credentials are returned and that the allowlist filters results. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loaded with the core action and resource, and every clause earns its place. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list tool with strong annotations, the description is complete: it names the resource, states the visibility constraint, and explains allowlist filtering. No additional information is required for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema fully covers inputs, so the baseline of 4 applies. The description adds no parameter-specific detail because there are no parameters to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a clear resource ('realms visible to the configured credentials'), while also noting the allowlist filtering behavior. This distinguishes it cleanly from get_realm and the other list_* sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly frames when the tool is appropriate: when listing all realms visible to the configured credentials. It does not explicitly name alternatives like get_realm or state when not to use it, but the context is clear enough for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_usersList / search usersBRead-onlyIdempotent
List users in a realm. Supports free-text search and pagination. Passwords and secrets are never returned by Keycloak.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Max results (default 50) | |
| first | No | Pagination offset | |
| realm | Yes | Realm name | |
| search | No | Free-text search across username, email, first and last name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered by structured data. The description adds one genuinely useful behavioral fact – that passwords and secrets are never returned – but says nothing about pagination defaults, result ordering, or empty-result behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler, and the core purpose is front-loaded ahead of the search/pagination note and the security caveat. Efficient, though the final sentence is somewhat tangential to tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values, and it only partially does so (it states what is never returned, not what a user record contains). For a simple read-only list tool with fully documented parameters, this is adequate but leaves the response shape unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (realm, max, first, search) are already documented with defaults and bounds in the schema. The description's mention of search and pagination adds no syntax, default, or format detail beyond that, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List users in a realm') plus the capabilities (free-text search, pagination), which is enough to separate it from get_user (single user) and count_users (aggregate count). It does not, however, explicitly name those siblings, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description asserts capabilities ('Supports free-text search and pagination') but never says when to use this tool instead of get_user or count_users, nor any exclusions or prerequisites. An agent must infer the routing decision from the names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.2.2- Changed
count_users1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_realm1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_user1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_clients1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_groups1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_realm_roles1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
list_users2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / first / maximumAdded value: +9007199254740991
8 tool updates
v0.1.0- First observed
count_users - First observed
get_realm - First observed
get_user - First observed
list_clients - First observed
list_groups - First observed
list_realm_roles - First observed
list_realms - First observed
list_users
TDQS
Scored across 8 tools
Each tool targets a clearly distinct resource and action: get_realm vs list_realms, list_users vs get_user vs count_users, and list_clients/list_realm_roles/list_groups all have separate scopes. Descriptions make the boundaries explicit, so an agent should not confuse them.
All tool names use snake_case with a consistent verb_noun pattern: get_realm, list_users, get_user, count_users, list_clients, list_realm_roles, list_groups, list_realms. There are no mixed conventions or vague verbs.
The server exposes 8 tools, which is well-scoped for a focused Keycloak read/inspection surface. No tool feels redundant, and the count avoids both bloat and a thin single-tool interface.
The surface is read-only and omits all create, update, and delete operations for realms, users, clients, roles, and groups. Even read coverage is incomplete, since there is no get_client, get_group, or get_role, leaving significant gaps for typical Keycloak administration.
Maintenance
Related MCP Connectors
- SkycloakOAuthio.skycloak
Managed Keycloak from any MCP client: clusters, realms, apps, SSO, users, domains, audit events.
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
Authenticated MCP server for ClearPolicy policy and compliance workflows.
Related MCP Servers
- AlicenseAqualityAmaintenanceAn MCP server for Keycloak Admin REST API, enabling user, group, event, and security management through service account authentication.30MIT
- AlicenseAqualityAmaintenanceEnables administrators to manage Keycloak realms, users, roles, clients, groups, and more through its Admin REST API, with safe-by-default configuration and destructive operation confirmation.5635 npm1MIT
- AlicenseAqualityCmaintenanceAn MCP server that lets an AI assistant inspect and modify Keycloak realm, client, and protocol-mapper configuration across multiple Keycloak hosts.754 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables administration of Keycloak identity and access management through MCP, allowing management of realms, clients, users, roles, groups, identity providers, and sessions from any MCP client.18 npmApache 2.0