关于 Keycloak MCP Server
Keycloak MCP Server 通过 Admin REST API 让 AI 助手管理 Keycloak Realm、用户、组和角色。它支持按工具集启用功能,并可用只读模式、Realm 白名单和变更确认预览限制写操作。
主要功能
- 01管理用户、组和角色
- 02查看 Realm、客户端、会话和事件
- 03按工具集启用工具
- 04敏感变更先预览并确认
- 05只读模式与 Realm 白名单
- 06引导式提示词和只读资源
适用场景
- 01办理员工账户入职或离职
- 02审查 Realm 安全设置
- 03调查登录失败
- 04搜索用户并管理组成员关系
MCP 相关
这是用于管理 Keycloak 的 MCP 服务,向 MCP 客户端提供工具、引导式提示词和只读资源。它通过 stdio 通信,并实施可配置的访问和写入保护。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y keycloak-model-context-protocolKEYCLOAK_URL密钥Base URL of the Keycloak server, e.g. https://keycloak.example.comKEYCLOAK_AUTH_REALM密钥Realm used to obtain the admin tokenKEYCLOAK_CLIENT_ID密钥Client ID used for login (default admin-cli for the password grant, required for client_credentials)KEYCLOAK_CLIENT_SECRET密钥Client secret for the client_credentials grant (recommended: a dedicated service account)KEYCLOAK_USERNAME密钥Username for the password grant (alternative to client credentials)KEYCLOAK_PASSWORD密钥Password for the password grantKEYCLOAK_GRANT_TYPE密钥Grant type; auto-detected if unset (client_credentials when a secret is set, else password)KEYCLOAK_MCP_READ_ONLY密钥If true, only read-only tools are registeredKEYCLOAK_MCP_REALMS密钥Comma-separated allowlist of target realms; empty means all realmsKEYCLOAK_MCP_ALLOW_MASTER_WRITE密钥If true, write tools may modify the master realmKEYCLOAK_MCP_TOOLSETS密钥Comma-separated enabled toolsets (core, groups, roles, clients, sessions, events, security) or allKEYCLOAK_MCP_REQUIRE_CONFIRMATION密钥If true, destructive tools require confirm=trueKEYCLOAK_MCP_TIMEOUT_MS密钥HTTP timeout for Keycloak requests in millisecondsKEYCLOAK_MCP_LOG_LEVEL密钥Log level written to stderr本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Keycloak MCP 服务
一个用于 Keycloak 管理的 Model Context Protocol(MCP)服务。它可让 Claude 等 AI 助手通过 Keycloak Admin REST API 管理用户、组、角色和会话,并检查客户端、事件以及领域的安全状况,同时采用最小权限身份验证,并为每项写入操作设置防护措施。
警告
此服务所执行的操作权限与您提供的 Keycloak 账户相同。请使用仅分配所需角色的专用服务账户客户端,切勿使用引导管理员账户。默认情况下,每个会更改数据的工具都会要求确认,并且提供只读模式。请参阅安全性。
亮点
- 7 个工具集共 24 个工具,可按工具集启用。默认工具集(
core、groups、roles)规模小,其余工具集均为可选。 - 最小权限身份验证。 推荐使用带服务账户的
client_credentials授权方式;也可使用密码授权方式。不设默认凭据,因此缺少设置时会立即报错。 - 防护措施。 只读模式、领域允许列表、禁止写入
master领域,以及每次更改都必须先预览、再通过confirm: true确认。系统会通过组合角色和父组检测管理员权限授予。 - 4 个引导式提示词(入职、离职、安全审计、登录失败调查)以及用于领域和用户的 MCP 资源,并支持自动补全领域名称。
- 结构化分页输出,带有输出架构;绝不返回或记录机密和凭据。
- 适用于 Claude Desktop、Claude Code、VS Code、Cursor 以及任何 stdio MCP 客户端。需要 Node.js 22 或更高版本。
工作原理
MCP 客户端会将服务作为本地子进程启动,并通过 stdio 与其通信。每次工具调用都会通过防护检查,然后交由统一网关处理 Keycloak 登录并缓存访问令牌。
已确认的调用示例
每个会更改数据的工具都是 破坏性 操作(会删除或撤销数据),或 敏感 操作(会更改身份、凭据、权限或保护机制,例如 user_update 或 user_role_assign)。如果未使用 confirm: true 调用,此类工具只会返回操作预览,不会进行任何更改。获得批准后,助手会再次使用 confirm: true 发起调用。
模型本身也可以设置 confirm: true,即使是首次调用也可以。此时服务仍会计算预览,并将其与结果一并返回,但只有客户端的批准提示才能证明有人类同意。所有此类工具都带有 destructiveHint,因此会在破坏性调用前征求确认的客户端,也会在这里征求确认。
快速开始
要求: Node.js 22 或更高版本、您的机器能够访问的 Keycloak 服务(已在 Keycloak 24.0 到 26.8 上测试),以及一个 MCP 客户端。
1. 准备 Keycloak(3 步)
在要管理的 realm 中(此处为 demo):
- 创建客户端
mcp-admin,开启 Client authentication,并且只启用 Service accounts roles(关闭 Standard flow 和 Direct access grants)。 - 分配角色。 在客户端的 Service accounts roles 选项卡中,分配
realm-management的客户端角色。首次进行只读试用时,可分配:view-users、query-users、query-groups、view-realm。 - 复制密钥,位置在客户端的 Credentials 选项卡中。
包含 Admin Console 点击路径、kcadm.sh 命令和本地 Docker Keycloak 的分步说明:docs/getting-started.md。
2. 配置 MCP 客户端
Claude Code 示例(其他客户端:docs/clients.md):
claude mcp add --transport stdio \
--env KEYCLOAK_URL=https://keycloak.example.com \
--env KEYCLOAK_AUTH_REALM=demo \
--env KEYCLOAK_CLIENT_ID=mcp-admin \
--env KEYCLOAK_CLIENT_SECRET="$KEYCLOAK_CLIENT_SECRET" \
keycloak -- npx -y keycloak-model-context-protocol@1
或使用 JSON(Claude Desktop,claude_desktop_config.json):
{
"mcpServers": {
"keycloak": {
"command": "npx",
"args": ["-y", "keycloak-model-context-protocol@1"],
"env": {
"KEYCLOAK_URL": "https://keycloak.example.com",
"KEYCLOAK_AUTH_REALM": "demo",
"KEYCLOAK_CLIENT_ID": "mcp-admin",
"KEYCLOAK_CLIENT_SECRET": "<client-secret>"
}
}
}
}
3. 提出你的第一个问题
列出你可以访问的 realm,然后显示 realm demo 中最前面的 10 个用户。
如果你得到了回答,就完成了。如果没有,请参阅 docs/troubleshooting.md。
配置
所有设置均为环境变量。只需设置 KEYCLOAK_URL 和一组凭据。
| 变量 | 默认值 | 用途 |
|---|---|---|
KEYCLOAK_URL | (必填) | Keycloak 服务的基础 URL |
KEYCLOAK_AUTH_REALM | master | 登录账户或客户端所在的 realm |
KEYCLOAK_CLIENT_ID / KEYCLOAK_CLIENT_SECRET | 无 | client_credentials 登录(推荐) |
KEYCLOAK_USERNAME / KEYCLOAK_PASSWORD | 无 | 密码授权登录(客户端默认为 admin-cli) |
KEYCLOAK_GRANT_TYPE | 自动 | client_credentials 或 password;根据设置的内容自动检测 |
KEYCLOAK_MCP_TOOLSETS | core,groups,roles | 已启用的工具集,或 all |
KEYCLOAK_MCP_READ_ONLY | false | 仅注册只读工具 |
KEYCLOAK_MCP_REALMS | 全部 | 以逗号分隔的目标 realm 允许列表 |
KEYCLOAK_MCP_ALLOW_MASTER_WRITE | false | 允许在 master realm 中使用写入工具 |
KEYCLOAK_MCP_REQUIRE_CONFIRMATION | true | 具有破坏性和敏感性的工具需要 confirm: true |
KEYCLOAK_MCP_TIMEOUT_MS | 30000 | Keycloak 请求的 HTTP 超时时间 |
KEYCLOAK_MCP_LOG_LEVEL | info | debug、info、warn 或 error(stderr) |
完整参考文档包含示例、验证规则和工具到角色的对应关系表:docs/configuration.md。
工具集和工具
工具的命名格式为 <domain>_<verb>。除非设置 KEYCLOAK_MCP_TOOLSETS,否则仅启用默认工具集。在只读模式下,仅注册 read 类型的工具。
| 工具集 | 默认 | 工具 |
|---|---|---|
core | 是 | realm_list、realm_get、user_search、user_get、user_create(敏感)、user_update(敏感)、user_delete(破坏性)、user_send_actions_email(敏感) |
groups | 是 | group_list、group_members_list、user_group_add(敏感)、user_group_remove(破坏性) |
roles | 是 | role_list、user_roles_list、user_role_assign(敏感)、user_role_revoke(破坏性) |
clients | 否 | client_list、client_get |
sessions | 否 | user_sessions_list、user_logout(破坏性) |
events | 否 | event_list、admin_event_list |
security | 否 | user_brute_force_status、user_brute_force_unlock(敏感) |
每个工具的详细信息(参数、输出、所需角色):docs/tools-reference.md。
提示词和资源
提示词是基于工具构建的引导式工作流。它们会显示在客户端的提示词选择器中(在 Claude Code 中以斜杠命令的形式显示)。realm 参数支持自动补全。
| 提示词 | 功能说明 |
|---|---|
onboard_employee | 创建用户、添加群组和角色,并发送欢迎电子邮件 |
offboard_employee | 审查离职员工的账户、结束会话并停用账户(不会删除账户) |
audit_realm_security | 以只读方式进行安全审查,并按优先级列出发现的问题 |
investigate_failed_logins | 分析登录失败情况和锁定状态,不做任何更改 |
资源是只读 JSON 文档,并按相同的 realm 允许列表进行筛选:
| URI | 内容 |
|---|---|
keycloak://realms | 可访问的 realm 名称 |
keycloak://realms/{realm} | realm 设置中的安全子集 |
keycloak://realms/{realm}/security-summary | 暴力破解、密码策略、SSL、OTP、事件标记、客户端暴露数量(不含机密信息) |
keycloak://realms/{realm}/users/{userId} | 单个用户的基本字段(不含属性和凭据) |
安全
- 首先遵循最小权限原则。 使用仅限于一个 realm、且只分配所需
realm-management角色的服务帐户客户端。角色矩阵见 docs/configuration.md。 - 每项更改都需要确认(
KEYCLOAK_MCP_REQUIRE_CONFIRMATION=true):破坏性和敏感工具会先显示预览。授予管理权限(包括通过复合角色和父组授予)、更改具有管理权限的帐户资料、为此类帐户发送操作邮件,以及更改服务自身帐户,都需要确认;设置KEYCLOAK_MCP_REQUIRE_CONFIRMATION=false也无法关闭这些确认。系统会拒绝为服务自身帐户授予角色或组、更改其资料或发送操作邮件。 - 防止帐户被接管: 更改后的电子邮件地址会被标记为未经验证,除非另有说明;操作邮件链接的有效期最长为 24 小时;预览会列出收件人地址,并说明目标帐户是否具有管理权限。
- 限制影响范围:
KEYCLOAK_MCP_READ_ONLY、KEYCLOAK_MCP_REALMS,以及对master的写入保护(默认关闭)。 - 输出和日志中不包含机密信息。 凭据在 stderr 中会被遮蔽;工具绝不会返回客户端机密、用户凭据或属性。
- 提示词注入: 将来自 Keycloak 的名称和描述视为数据。随附的提示词会明确说明这一点;不需要写入工具时,请保持其禁用状态。
威胁模型、加固检查清单以及漏洞报告方式见:docs/security.md 和 SECURITY.md。
示例提示词
- “你能看到哪些 realms?给我看看 realm
demo的设置。” - “找出
demo中所有电子邮件地址以@example.com结尾且已禁用的用户。” - “在
demo中创建用户jdoe(Jane Doe,[email protected]),将她添加到组engineering,并向她发送设置密码的电子邮件。” - “组
ops中有哪些成员?alice有哪些角色,包括复合角色?” - “对
demo运行audit_realm_security提示词。” (完整审计需要clients和events工具集) - “昨晚有许多登录失败。调查 realm
demo。” - “将
demo中的bob办理离职:结束他的会话并禁用帐户。”
文档
| 文档 | 内容 |
|---|---|
| docs/getting-started.md | 本地 Keycloak、服务帐户设置、首次运行、MCP Inspector |
| docs/configuration.md | 环境变量参考、角色矩阵、角色配置、TLS |
| docs/clients.md | Claude Desktop、Claude Code、VS Code、Cursor、通用客户端 |
| docs/tools-reference.md | 每种工具的详细说明 |
| docs/security.md | 威胁模型与加固 |
| docs/troubleshooting.md | 症状、原因、解决方法 |
| docs/architecture.md | 组件、流程、设计决策 |
| CHANGELOG.md | 发行说明 |
从 0.x 升级
1.0 版本更改了默认设置:必须提供凭据(不再回退到 admin/admin),破坏性工具会要求确认,并且工具已重命名为 <domain>_<verb>(例如,create-user 变为 user_create,delete-user 变为 user_delete)。旧变量 KEYCLOAK_ADMIN 和 KEYCLOAK_ADMIN_PASSWORD 仍然可用,但已弃用。请参阅迁移指南。
Contributing and license
Contributions are welcome. See CONTRIBUTING.md and the Code of Conduct. Released under the MIT License.
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。