Administer Keycloak by managing users, realms, roles, and other resources through an LLM interface.
A powerful Model Context Protocol server for Keycloak administration, providing a comprehensive set of tools to manage users, realms, roles, and other Keycloak resources through LLM interfaces.
The server is available as an NPM package:
# Direct usage with npx
npx -y @octodet/keycloak-mcp
# Or global installation
npm install -g @octodet/keycloak-mcp
Variable | Description | Default |
---|---|---|
KEYCLOAK_URL | Keycloak server URL | http://localhost:8080 |
KEYCLOAK_ADMIN | Admin username | admin |
KEYCLOAK_ADMIN_PASSWORD | Admin password | admin |
KEYCLOAK_REALM | Default realm | master |
Add this to your settings.json
:
{
"mcp.servers": {
"keycloak": {
"command": "npx",
"args": ["-y", "@octodet/keycloak-mcp"],
"env": {
"KEYCLOAK_URL": "http://localhost:8080",
"KEYCLOAK_ADMIN": "admin",
"KEYCLOAK_ADMIN_PASSWORD": "admin"
}
}
}
}
Configure in your Claude Desktop configuration file:
{
"mcpServers": {
"keycloak": {
"command": "npx",
"args": ["-y", "@octodet/keycloak-mcp"],
"env": {
"KEYCLOAK_URL": "http://localhost:8080",
"KEYCLOAK_ADMIN": "admin",
"KEYCLOAK_ADMIN_PASSWORD": "admin"
}
}
}
}
{
"mcpServers": {
"keycloak": {
"command": "node",
"args": ["path/to/build/index.js"],
"env": {
"KEYCLOAK_URL": "http://localhost:8080",
"KEYCLOAK_ADMIN": "admin",
"KEYCLOAK_ADMIN_PASSWORD": "admin"
}
}
}
}
The server provides a comprehensive set of MCP tools for Keycloak administration. Each tool is designed to perform specific administrative tasks across realms, users, and roles.
Tool | Category | Description |
---|---|---|
create-user | User Management | Create a new user in a specified realm |
delete-user | User Management | Delete an existing user from a realm |
list-users | User Management | List all users in a specified realm |
list-realms | Realm Management | List all available realms |
list-roles | Role Management | List all roles for a specific client |
update-user-roles | Role Management | Add or remove client roles for a user |
create-user
Creates a new user in a specified realm with comprehensive user attributes and optional credentials.
Required Parameters:
realm
(string): Target realm nameusername
(string): Unique username for the new useremail
(string): Valid email addressfirstName
(string): User's first namelastName
(string): User's last nameOptional Parameters:
enabled
(boolean): Enable/disable user account (default: true
)emailVerified
(boolean): Mark email as verifiedcredentials
(array): Array of credential objects for setting passwordsCredential Object Structure:
type
(string): Credential type (e.g., "password")value
(string): The credential valuetemporary
(boolean): Whether password must be changed on first loginExample Usage:
{
"realm": "my-app-realm",
"username": "john.doe",
"email": "john.doe@company.com",
"firstName": "John",
"lastName": "Doe",
"enabled": true,
"emailVerified": true,
"credentials": [
{
"type": "password",
"value": "TempPassword123!",
"temporary": true
}
]
}
Response: Returns the created user ID and confirmation message.
delete-user
Permanently removes a user from the specified realm. This action cannot be undone.
Required Parameters:
realm
(string): Target realm nameuserId
(string): Unique identifier of the user to deleteExample Usage:
{
"realm": "my-app-realm",
"userId": "8f5c21e3-7c9d-4b5a-9f3e-8d4f6a2e7b1c"
}
Response: Confirmation message of successful deletion.
⚠️ Warning: This operation is irreversible. Ensure you have the correct user ID before execution.
list-users
Retrieves a list of all users in the specified realm with their basic information.
Required Parameters:
realm
(string): Target realm nameExample Usage:
{
"realm": "my-app-realm"
}
Response: Returns a formatted list showing usernames and user IDs for all users in the realm.
list-realms
Retrieves all available realms in the Keycloak instance.
Parameters: None required
Example Usage:
{}
Response: Returns a list of all realm names available in the Keycloak installation.
Use Cases:
list-roles
Lists all roles defined for a specific client within a realm. Useful for understanding available permissions and roles before assignment.
Required Parameters:
realm
(string): Target realm nameclientId
(string): Client ID or UUID of the target clientExample Usage:
{
"realm": "my-app-realm",
"clientId": "my-application"
}
Alternative with Client UUID:
{
"realm": "my-app-realm",
"clientId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
Response: Returns a formatted list of all role names available for the specified client.
💡 Tip: You can use either the client's human-readable ID or its UUID identifier.
update-user-roles
Manages client role assignments for a user. Allows both adding and removing roles in a single operation.
Required Parameters:
realm
(string): Target realm nameuserId
(string): User's unique identifierclientId
(string): Client ID or UUIDOptional Parameters:
rolesToAdd
(array): List of role names to assign to the userrolesToRemove
(array): List of role names to remove from the userExample Usage - Adding Roles:
{
"realm": "my-app-realm",
"userId": "8f5c21e3-7c9d-4b5a-9f3e-8d4f6a2e7b1c",
"clientId": "my-application",
"rolesToAdd": ["admin", "user-manager", "report-viewer"]
}
Example Usage - Removing Roles:
{
"realm": "my-app-realm",
"userId": "8f5c21e3-7c9d-4b5a-9f3e-8d4f6a2e7b1c",
"clientId": "my-application",
"rolesToRemove": ["temporary-access", "beta-tester"]
}
Example Usage - Combined Operation:
{
"realm": "my-app-realm",
"userId": "8f5c21e3-7c9d-4b5a-9f3e-8d4f6a2e7b1c",
"clientId": "my-application",
"rolesToAdd": ["senior-user"],
"rolesToRemove": ["junior-user", "trainee"]
}
Response: Detailed summary of roles added, removed, and any errors encountered.
🔍 Notes:
rolesToAdd
or rolesToRemove
must be providedUser IDs vs Usernames: Most operations require user IDs (UUIDs), not usernames. Use list-users
to find the correct user ID.
Client Identification: The clientId
parameter accepts both human-readable client IDs and UUID identifiers.
Realm Validation: Always verify realm names using list-realms
before performing operations.
Role Discovery: Use list-roles
to discover available roles before attempting role assignments.
Error Handling: All tools provide detailed error messages for troubleshooting authentication, permission, or parameter issues.
# Clone the repository
git clone <repository-url>
# Install dependencies
npm install
# Start the development server with watch mode
npm run watch
To add a new tool to the server:
src/index.ts
using ZodListToolsRequestSchema
handlerCallToolRequestSchema
switch statementThe MCP Inspector is a great tool for testing your MCP server:
npx -y @modelcontextprotocol/inspector npx -y @octodet/keycloak-mcp
For testing with a local Keycloak instance:
# Start Keycloak with Docker
docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:latest start-dev
# In another terminal, run the MCP server
npm run build
node build/index.js
This project is published to NPM under @octodet/keycloak-mcp.
This project uses GitHub Actions for CI/CD to automatically test and publish to NPM when a new release is created.
This project is licensed under the MIT License - see the LICENSE file for details.
Octodet - Building intelligent tools for developers
A server for Kubernetes CLI tools like kubectl, istioctl, helm, and argocd, supporting multi-cluster management via dynamic kubeconfig.
MCP Server that connects AI agents to Chargebee platform.
Interact with Stripe API
Exposes Check Point security management data for AI-powered automation and analysis.
Interact with AWS services using the AWS CLI. Requires AWS CLI to be installed and configured.
Interact with Webflow APIs to list and edit your site and CMS data.
A Model Context Protocol (MCP) server that provides tools for AI, allowing it to interact with the DataWorks Open API through a standardized interface. This implementation is based on the Aliyun Open API and enables AI agents to perform cloud resources operations seamlessly.
An MCP server implementation for interacting with Azure Health Data Services FHIR.
Manage Aiven cloud services like Kafka, PostgreSQL, and Redis via its API.
An MCP service for deploying HTML content to EdgeOne Pages and obtaining a publicly accessible URL.