Skip to main content
Glama
mcp-keycloak

mcp-keycloak

mcp-keycloak

CI License: MIT

Keycloak용 Model Context Protocol 서버입니다. MCP를 지원하는 클라이언트(Claude Desktop, Claude Code 등)가 Keycloak의 realm, 사용자, 클라이언트, 역할, 그룹을 조회하고 관리할 수 있게 하며, 보안은 전적으로 플래그에 의해 제어됩니다.

설계 목표는 안전이 기본값이라는 것입니다. 읽기 전용으로 시작하고, Realm 허용 목록으로 범위를 제한하며, 민감한 Realm은 변경으로부터 보호하고, 파괴적인 작업은 명시적인 옵트인을 거쳐야만 허용됩니다.

기능

  • 멀티 Realm — 모든 도구는 realm 인자를 받습니다. 허용 목록으로 범위를 제한할 수 있습니다.

  • 접근 모드 — read-only → read-write → admin 순서로 계층화되어, 각 모드는 현재 수준보다 높은 도구를 절대 노출하지 않습니다.

  • 보안 플래그 — Realm 허용 목록, 보호되는 Realm, 삭제 통제, dry-run, JSON 감사 로깅(아래 참조)

  • 두 가지 인증 방식 — 기밀 클라이언트 서비스 계정(권장) 또는 관리자 사용자 이름/비밀번호.

  • 무거운 의존성 없음 — 가벼운 fetch 기반 Admin REST 클라이언트와 MCP SDK 및 zod만 사용합니다.

Related MCP server: keycloak-mcp

보안 모델

제어 항목

플래그

기본값

효과

서버가 어떤 작업을 수행할 수 있는가?

KEYCLOAK_MODE

read-only

read-only는 읽기 도구만 노출하고 read-write는 변경 도구, admin은 파괴적 도구를 추가합니다. 현재 모드보다 높은 수준의 도구는 등록되지 않습니다.

어떤 Realm이 작업 대상인가?

KEYCLOAK_REALM_ALLOWLIST

(전체)

쉼표로 구분됩니다. 이 값이 설정되면 목록에 없는 Realm에 대한 모든 작업이 거부됩니다.

어떤 Realm이 영구적으로 읽기 전용인가?

KEYCLOAK_PROTECTED_REALMS

master

보호된 Realm은 모드와 관계없이 읽기만 가능하고 변경 또는 삭제할 수 없습니다.

삭제를 허용할 것인가?

KEYCLOAK_ALLOW_DELETE

false

delete_* 도구는 이 플래그 및 admin 모드가 모두 필요합니다.

Keycloak에 실작업 없이 미리 보기

KEYCLOAK_DRY_RUN

false

쓰기/관리 도구는 의도를 검증하고 로그로 남긴 뒤 Keycloak을 호출하지 않고 반환합니다.

감사 추적

KEYCLOAK_AUDIT_LOG

true

통제되는 작업마다 JSON 한 줄을 stderr에 출력합니다(ALLOW / DENY / DRY_RUN).

이 계층들은 서로 독립적입니다. 예를 들어 KEYCLOAK_ALLOW_DELETE=false인 admin 모드는 사용자를 생성하고 업데이트할 수 있지만 삭제할 수는 없습니다.

도구

읽기 (read-only+): list_realms, get_realm, list_users, get_user, count_users, list_clients, list_realm_roles, list_groups

쓰기 (read-write+): create_user, update_user, reset_password, logout_user

관리자 (admin): delete_user

MCP 클라이언트와 함께 사용하기

Claude Code, Claude Desktop, Cursor, OpenAI Codex CLI, Windsurf, VS Code(Copilot) 등 모든 MCP 클라이언트에서 동작합니다. 클라이언트별 설정은 docs/CLIENTS.md 를 참조하세요.

설치

npm install
npm run build

설정

.env.example을 복사하고 값을 채우거나, MCP 클라이언트 설정에 변수를 직접 넣으세요. 필요한 realm-management 역할을 가진 기밀 클라이언트가 권장되는 자격 증명입니다.

Claude Desktop / Claude Code에서 실행하기

claude_desktop_config.json 또는 claude mcp add 명령으로 MCP 클라이언트 설정에 추가하세요:

{
  "mcpServers": {
    "keycloak": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-keycloak/dist/index.js"],
      "env": {
        "KEYCLOAK_URL": "https://keycloak.example.com",
        "KEYCLOAK_CLIENT_ID": "admin-cli",
        "KEYCLOAK_CLIENT_SECRET": "your-secret",
        "KEYCLOAK_MODE": "read-only",
        "KEYCLOAK_REALM_ALLOWLIST": "app,customers"
      }
    }
  }
}

모델이 변경 작업을 실제로 수행하게 하려는 경우에만 KEYCLOAK_MODE를 read-write로 올리고(삭제 작업은 admin + KEYCLOAK_ALLOW_DELETE=true) 설정하세요.

개발

npm run dev        # watch mode
npm test           # unit tests for the security policy
npm run typecheck

배포

이 서버는 공식 MCP 레지스트리용으로 server.json을, npm 소유권 인증용으로 mcpName을 제공합니다. npm 배포와 MCP 레지스트리, Smithery, Glama, Cursor, PulseMCP 등록 방법은 PUBLISHING.md 를 참조하세요.

라이선스

MIT

Available Tools

8 tools
count_usersCount usersA
Read-onlyIdempotent

Return the number of users in a realm, optionally matching a search term.

NameRequiredDescriptionDefault
realmYesRealm name
searchNoOptional search term

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 settingsC
Read-onlyIdempotent

Fetch the configuration of a single realm.

NameRequiredDescriptionDefault
realmYesRealm name

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 idB
Read-onlyIdempotent

Fetch a single user representation by their Keycloak id.

NameRequiredDescriptionDefault
realmYesRealm name
userIdYesKeycloak user id (UUID)

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 clientsA
Read-onlyIdempotent

List OAuth/OIDC clients configured in a realm. Client secrets are not included.

NameRequiredDescriptionDefault
realmYesRealm name
clientIdNoFilter by clientId

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 groupsC
Read-onlyIdempotent

List groups in a realm.

NameRequiredDescriptionDefault
realmYesRealm name
searchNoOptional search term

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 rolesC
Read-onlyIdempotent

List the realm-level roles defined in a realm.

NameRequiredDescriptionDefault
realmYesRealm name

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 realmsA
Read-onlyIdempotent

List all realms visible to the configured credentials. Realms outside the allowlist are filtered out.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 usersB
Read-onlyIdempotent

List users in a realm. Supports free-text search and pagination. Passwords and secrets are never returned by Keycloak.

NameRequiredDescriptionDefault
maxNoMax results (default 50)
firstNoPagination offset
realmYesRealm name
searchNoFree-text search across username, email, first and last name

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 7 tool updatesv0.2.2
    • Changedcount_users1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_realm1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_user1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlist_clients1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlist_groups1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlist_realm_roles1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedlist_users2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / first / maximum
        Added value: +9007199254740991
  2. 8 tool updatesv0.1.0
    • First observedcount_users
    • First observedget_realm
    • First observedget_user
    • First observedlist_clients
    • First observedlist_groups
    • First observedlist_realm_roles
    • First observedlist_realms
    • First observedlist_users

TDQS

A3.5/5.0

Scored across 8 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness2/5

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

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    An MCP server for Keycloak Admin REST API, enabling user, group, event, and security management through service account authentication.
    33
    82 PyPI
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that lets an AI assistant inspect and modify Keycloak realm, client, and protocol-mapper configuration across multiple Keycloak hosts.
    7
    79 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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.
    42 npm
    Apache 2.0
  • A
    license
    C
    quality
    D
    maintenance
    A comprehensive MCP server for Keycloak administration, offering 80+ tools to manage users, realms, clients, roles, groups, sessions, events, organizations, and more directly from AI assistants.
    86
    42 npm
    MIT