scim-mcp / src /tools /generateRandomUserResource.ts
chenhunghan's picture
feat: add externalId to generated user resource
10f8411 unverified
import { faker } from "@faker-js/faker";
import { type InferSchema, type ToolMetadata } from "xmcp";
import { z } from "zod";
export const metadata: ToolMetadata = {
name: "generate-one-random-user-resource",
description: "Generate a realistic SCIM user resource with optional overrides, does not create the user in the system,use with create-user tool to provision the user",
annotations: {
title: "Generate Random User Resource",
readOnlyHint: true,
destructiveHint: false,
idempotentHint: false,
openWorldHint: false,
},
};
export const schema = {
userName: z.string().optional().describe("Override the generated userName"),
firstName: z.string().optional().describe("Override the generated first name"),
lastName: z.string().optional().describe("Override the generated last name"),
displayName: z.string().optional().describe("Override the generated display name"),
email: z.string().optional().describe("Override the generated email"),
active: z.boolean().optional().describe("Override the active status (default: true)"),
employeeNumber: z.string().optional().describe("Override the generated employee number"),
department: z.string().optional().describe("Override the generated department"),
organization: z.string().optional().describe("Override the generated organization"),
};
export default async function generateRandomUserResource(params: InferSchema<typeof schema>) {
const firstName = params.firstName ?? faker.person.firstName();
const lastName = params.lastName ?? faker.person.lastName();
const email = params.email ?? faker.internet.email({ firstName, lastName }).toLowerCase();
const userName = params.userName ?? faker.internet.username({ firstName, lastName }).toLowerCase();
const displayName = params.displayName ?? `${firstName} ${lastName}`;
const active = params.active ?? true;
const employeeNumber = params.employeeNumber ?? faker.string.numeric(6);
const department = params.department ?? faker.commerce.department();
const organization = params.organization ?? faker.company.name();
const userResource = {
schemas: ["urn:ietf:params:scim:schemas:core:2.0:User"],
userName: userName,
externalId: faker.string.uuid(),
name: {
formatted: displayName,
familyName: lastName,
givenName: firstName,
},
displayName: displayName,
emails: [
{
value: email,
type: "work",
primary: true,
},
],
active: active,
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
employeeNumber: employeeNumber,
department: department,
organization: organization,
},
};
return {
content: [
{
type: "text",
text: `Generated realistic SCIM user resource:\n\nUserName: ${userName}\nEmail: ${email}\nName: ${firstName} ${lastName}\n\n💡 This resource can be used directly with the create-user tool.`,
},
],
structuredContent: userResource,
};
}