import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import type { BirstClient } from "../../client/birstClient.js";
import { z } from "zod";
interface User {
id: string;
username: string;
email?: string;
firstName?: string;
lastName?: string;
adminAccountId?: string;
repositoryAdmin?: boolean;
disabled?: boolean;
isLockedOut?: boolean;
}
const inputSchema = z.object({
offset: z.number().optional().default(0).describe("Number of users to skip"),
fetchRowCount: z.number().optional().default(100).describe("Number of users to fetch"),
search: z.string().optional().describe(
"Search by username, email, first name, or last name"
),
});
export function registerListUsers(server: McpServer, client: BirstClient): void {
server.tool(
"birst_list_users",
"List users in the Birst account. Supports pagination and search.",
inputSchema.shape,
async (args) => {
const { offset, fetchRowCount, search } = inputSchema.parse(args);
const users = await client.rest<User[]>("/users", {
queryParams: {
offset,
fetchRowCount,
search,
},
});
const simplified = users.map((user) => ({
id: user.id,
username: user.username,
email: user.email,
firstName: user.firstName,
lastName: user.lastName,
isAdmin: !!user.adminAccountId,
isRepositoryAdmin: user.repositoryAdmin,
disabled: user.disabled,
lockedOut: user.isLockedOut,
}));
return {
content: [
{
type: "text" as const,
text: JSON.stringify(
{
success: true,
count: users.length,
offset,
limit: fetchRowCount,
users: simplified,
},
null,
2
),
},
],
};
}
);
}