import { getSlackClient, handleSlackError } from "../slack-client.js";
import type { SlackUser, SlackUserProfile } from "../types/slack.js";
export async function listUsers(options?: {
limit?: number;
cursor?: string;
includeLocale?: boolean;
}): Promise<{
users: SlackUser[];
nextCursor?: string;
}> {
const client = getSlackClient();
try {
const result = await client.users.list({
limit: options?.limit || 100,
cursor: options?.cursor,
include_locale: options?.includeLocale,
});
const users: SlackUser[] = (result.members || [])
.filter((u) => !u.deleted)
.map((u) => ({
id: u.id!,
name: u.name || "",
real_name: u.real_name,
display_name: u.profile?.display_name,
email: u.profile?.email,
is_bot: u.is_bot || false,
is_admin: u.is_admin || false,
profile: u.profile
? {
display_name: u.profile.display_name,
real_name: u.profile.real_name,
email: u.profile.email,
image_24: u.profile.image_24,
image_48: u.profile.image_48,
image_72: u.profile.image_72,
image_192: u.profile.image_192,
status_text: u.profile.status_text,
status_emoji: u.profile.status_emoji,
}
: undefined,
}));
return {
users,
nextCursor: result.response_metadata?.next_cursor || undefined,
};
} catch (error) {
handleSlackError(error);
}
}
export async function getUserInfo(userId: string): Promise<SlackUser> {
const client = getSlackClient();
try {
const result = await client.users.info({
user: userId,
});
const u = result.user!;
return {
id: u.id!,
name: u.name || "",
real_name: u.real_name,
display_name: u.profile?.display_name,
email: u.profile?.email,
is_bot: u.is_bot || false,
is_admin: u.is_admin || false,
profile: u.profile
? {
display_name: u.profile.display_name,
real_name: u.profile.real_name,
email: u.profile.email,
image_24: u.profile.image_24,
image_48: u.profile.image_48,
image_72: u.profile.image_72,
image_192: u.profile.image_192,
status_text: u.profile.status_text,
status_emoji: u.profile.status_emoji,
}
: undefined,
};
} catch (error) {
handleSlackError(error);
}
}
export async function getUserProfile(userId?: string): Promise<SlackUserProfile> {
const client = getSlackClient();
try {
const result = await client.users.profile.get({
user: userId,
});
const p = result.profile!;
return {
display_name: p.display_name,
real_name: p.real_name,
email: p.email,
image_24: p.image_24,
image_48: p.image_48,
image_72: p.image_72,
image_192: p.image_192,
status_text: p.status_text,
status_emoji: p.status_emoji,
};
} catch (error) {
handleSlackError(error);
}
}
export const userToolDefinitions = [
{
name: "slack_list_users",
description: "List all users in the Slack workspace",
inputSchema: {
type: "object" as const,
properties: {
limit: {
type: "number",
description: "Maximum number of users to return (max 1000)",
default: 100,
},
cursor: {
type: "string",
description: "Pagination cursor for next page",
},
},
required: [],
},
},
{
name: "slack_get_user_info",
description: "Get detailed information about a specific user",
inputSchema: {
type: "object" as const,
properties: {
user_id: {
type: "string",
description: "The ID of the user (e.g., U1234567890)",
},
},
required: ["user_id"],
},
},
{
name: "slack_get_user_profile",
description: "Get a user's profile information",
inputSchema: {
type: "object" as const,
properties: {
user_id: {
type: "string",
description: "The ID of the user. If omitted, returns the authenticated user's profile",
},
},
required: [],
},
},
];