Skip to main content
Glama
kapilduraphe

Okta MCP Server

list_group_users

Retrieve and manage users within a specific group in Okta by providing the group ID, with options for pagination and limiting results for efficient user management.

Instructions

List all users in a specific group

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
afterNoCursor for pagination, obtained from previous response
groupIdYesID of the group
limitNoMaximum number of users to return (default: 50, max: 200)

Implementation Reference

  • The main handler function for the 'list_group_users' tool. It validates input parameters using Zod, retrieves the Okta client, calls the Okta API to list users in the specified group with pagination support, formats the user list into a readable text response, and handles errors.
      list_group_users: async (request: { parameters: unknown }) => {
        const params = groupSchemas.listGroupUsers.parse(request.parameters);
    
        try {
          const oktaClient = getOktaClient();
    
          // Build query parameters for pagination
          const queryParams: Record<string, any> = {};
          if (params.limit) queryParams.limit = params.limit;
          if (params.after) queryParams.after = params.after;
    
          // Get group users list
          const users = await oktaClient.groupApi.listGroupUsers({
            groupId: params.groupId,
            ...queryParams,
          });
    
          if (!users) {
            return {
              content: [
                {
                  type: "text",
                  text: "No users data was returned from Okta.",
                },
              ],
            };
          }
    
          // Format the response
          let formattedResponse = `Users in Group (ID: ${params.groupId}):\n`;
          let count = 0;
    
          // Track pagination info
          let after: string | undefined;
    
          // Process the users collection
          for await (const user of users) {
            // Check if user is valid
            if (!user || !user.id) {
              continue;
            }
    
            count++;
    
            // Remember the last user ID for pagination
            after = user.id;
    
            formattedResponse += `
    ${count}. ${user.profile?.firstName || ""} ${user.profile?.lastName || ""} (${user.profile?.email || "No email"})
     - ID: ${user.id}
     - Status: ${user.status || "Unknown"}
     - Created: ${formatDate(user.created)}
     - Last Updated: ${formatDate(user.lastUpdated)}
    `;
          }
    
          if (count === 0) {
            return {
              content: [
                {
                  type: "text",
                  text: "No users found in this group.",
                },
              ],
            };
          }
    
          // Add pagination information
          if (after && count >= (params.limit || 50)) {
            formattedResponse += `\nPagination:\n- Total users shown: ${count}\n`;
            formattedResponse += `- For next page, use 'after' parameter with value: ${after}\n`;
          } else {
            formattedResponse += `\nTotal users in group: ${count}\n`;
          }
    
          return {
            content: [
              {
                type: "text",
                text: formattedResponse,
              },
            ],
          };
        } catch (error) {
          console.error("Error listing group users:", error);
          return {
            content: [
              {
                type: "text",
                text: `Failed to list group users: ${error instanceof Error ? error.message : String(error)}`,
              },
            ],
            isError: true,
          };
        }
      },
  • Zod schema for input validation of the 'list_group_users' tool parameters, used in the handler to parse and validate the request.parameters.
    listGroupUsers: z.object({
      groupId: z.string().min(1, "Group ID is required"),
      limit: z.number().min(1).max(200).optional().default(50),
      after: z.string().optional(),
    }),
  • Tool registration entry in the groupTools array, defining the name, description, and JSON inputSchema for the MCP tool 'list_group_users'.
    {
      name: "list_group_users",
      description: "List all users in a specific group",
      inputSchema: {
        type: "object",
        properties: {
          groupId: {
            type: "string",
            description: "ID of the group",
          },
          limit: {
            type: "number",
            description:
              "Maximum number of users to return (default: 50, max: 200)",
          },
          after: {
            type: "string",
            description: "Cursor for pagination, obtained from previous response",
          },
        },
        required: ["groupId"],
      },
    },
  • Utility function to initialize and return the Okta client instance, used by the handler to make API calls.
    function getOktaClient() {
      const oktaDomain = process.env.OKTA_ORG_URL;
      const apiToken = process.env.OKTA_API_TOKEN;
    
      if (!oktaDomain) {
        throw new Error(
          "OKTA_ORG_URL environment variable is not set. Please set it to your Okta domain."
        );
      }
    
      if (!apiToken) {
        throw new Error(
          "OKTA_API_TOKEN environment variable is not set. Please generate an API token in the Okta Admin Console."
        );
      }
    
      return new OktaClient({
        orgUrl: oktaDomain,
        token: apiToken,
      });
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kapilduraphe/okta-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server