keycloak-mcp
Version:
MCP server for Keycloak
97 lines • 3.78 kB
JavaScript
import KeycloakConfig from "../config/keycloak.js";
import { AddUserToGroupSchema, AssignClientRoleSchema, CreateUserSchema, DeleteUserSchema, ListClientRolesSchema, ListClientsSchema, ListGroupsSchema, ListUsersSchema, } from "../schemas/index.js";
class KeycloakService {
keycloakConfig;
kcAdminClient;
constructor(keycloakConfig) {
this.keycloakConfig = keycloakConfig;
this.kcAdminClient = this.keycloakConfig.getAdminClient();
}
async createUser(args) {
const { realm, username, email, firstName, lastName } = CreateUserSchema.parse(args);
const user = await this.kcAdminClient.users.create({
realm,
username,
email,
firstName,
lastName,
enabled: true,
});
return `User created successfully. User ID: ${user.id}`;
}
async deleteUser(args) {
const { realm, userId } = DeleteUserSchema.parse(args);
await this.kcAdminClient.users.del({ id: userId, realm });
return `User ${userId} deleted successfully from realm ${realm}`;
}
async listRealms() {
const realms = await this.kcAdminClient.realms.find();
return `Available realms:\n${realms
.map((r) => `- ${r.realm} (${r.id})`)
.join("\n")}`;
}
async listUsers(args) {
const { realm } = ListUsersSchema.parse(args);
const users = await this.kcAdminClient.users.find({
realm,
});
return `Users in realm ${realm}:\n${users
.map((u) => `- ${u.username} (${u.id})`)
.join("\n")}`;
}
async assignClientRoleToUser(args) {
const { realm, userId, clientUniqueId, roleName } = AssignClientRoleSchema.parse(args);
const roles = await this.kcAdminClient.clients.listRoles({
id: clientUniqueId,
realm,
});
const role = roles.find((r) => r.name === roleName);
if (!role || !role.id || !role.name) {
throw new Error(`Role '${roleName}' not found or has no ID.`);
}
await this.kcAdminClient.users.addClientRoleMappings({
realm,
id: userId,
clientUniqueId,
roles: [{ id: role.id, name: role.name }],
});
return `Assigned role '${roleName}' to user ${userId} in client ${clientUniqueId}`;
}
async addUserToGroup(args) {
const { realm, userId, groupId } = AddUserToGroupSchema.parse(args);
await this.kcAdminClient.users.addToGroup({
realm,
id: userId,
groupId,
});
return `User ${userId} added to group ${groupId} in realm ${realm}`;
}
async listClients(args) {
const { realm } = ListClientsSchema.parse(args);
const clients = await this.kcAdminClient.clients.find({ realm });
return `Clients in realm ${realm}:\n${clients
.map((c) => `- ${c.clientId} (${c.id})`)
.join("\n")}`;
}
async listGroups(args) {
const { realm } = ListGroupsSchema.parse(args);
const groups = await this.kcAdminClient.groups.find({
realm,
});
return `Groups in realm ${realm}:\n${groups
.map((g) => `- ${g.name} (${g.id})`)
.join("\n")}`;
}
async listClientRoles(args) {
const { realm, clientUniqueId } = ListClientRolesSchema.parse(args);
const roles = await this.kcAdminClient.clients.listRoles({
id: clientUniqueId,
realm,
});
return `Roles in client ${clientUniqueId} in realm ${realm}:\n${roles
.map((r) => `- ${r.name}`)
.join("\n")}`;
}
}
export default KeycloakService;
//# sourceMappingURL=keycloak.js.map