-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Expand file tree
/
Copy pathlist_users.ts
More file actions
145 lines (132 loc) · 4.27 KB
/
Copy pathlist_users.ts
File metadata and controls
145 lines (132 loc) · 4.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import type { SlackListUsersParams, SlackListUsersResponse } from '@/tools/slack/types'
import { USER_SUMMARY_OUTPUT_PROPERTIES } from '@/tools/slack/types'
import type { ToolConfig } from '@/tools/types'
export const slackListUsersTool: ToolConfig<SlackListUsersParams, SlackListUsersResponse> = {
id: 'slack_list_users',
name: 'Slack List Users',
description: 'List all users in a Slack workspace. Returns user profiles with names and avatars.',
version: '1.0.0',
oauth: {
required: true,
provider: 'slack',
},
params: {
authMethod: {
type: 'string',
required: false,
visibility: 'user-only',
description: 'Authentication method: oauth or bot_token',
},
botToken: {
type: 'string',
required: false,
visibility: 'user-only',
description: 'Bot token for Custom Bot',
},
accessToken: {
type: 'string',
required: false,
visibility: 'hidden',
description: 'OAuth access token or bot token for Slack API',
},
includeDeleted: {
type: 'boolean',
required: false,
visibility: 'user-or-llm',
description: 'Include deactivated/deleted users (default: false)',
},
limit: {
type: 'number',
required: false,
visibility: 'user-or-llm',
description: 'Maximum number of users to return (default: 100, max: 200)',
},
},
request: {
url: (params: SlackListUsersParams) => {
const url = new URL('https://slack.com/api/users.list')
// Set limit (default 100, max 200)
const limit = params.limit ? Math.min(Number(params.limit), 200) : 100
url.searchParams.append('limit', String(limit))
return url.toString()
},
method: 'GET',
headers: (params: SlackListUsersParams) => ({
'Content-Type': 'application/json',
Authorization: `Bearer ${params.accessToken || params.botToken}`,
}),
},
transformResponse: async (response: Response, params?: SlackListUsersParams) => {
const data = await response.json()
if (!data.ok) {
if (data.error === 'missing_scope') {
throw new Error(
'Missing required permissions. Please reconnect your Slack account with the necessary scopes (users:read).'
)
}
if (data.error === 'invalid_auth') {
throw new Error('Invalid authentication. Please check your Slack credentials.')
}
throw new Error(data.error || 'Failed to list users from Slack')
}
const includeDeleted = params?.includeDeleted === true
const users = (data.members || [])
.filter((user: any) => {
// Always filter out Slackbot
if (user.id === 'USLACKBOT') return false
// Filter deleted users unless includeDeleted is true
if (!includeDeleted && user.deleted) return false
return true
})
.map((user: any) => ({
id: user.id,
name: user.name,
real_name: user.real_name || user.profile?.real_name || '',
display_name: user.profile?.display_name || '',
email: user.profile?.email || '',
is_bot: user.is_bot || false,
is_admin: user.is_admin || false,
is_owner: user.is_owner || false,
deleted: user.deleted || false,
timezone: user.tz,
avatar: user.profile?.image_72 || user.profile?.image_48 || '',
status_text: user.profile?.status_text || '',
status_emoji: user.profile?.status_emoji || '',
}))
const ids = users.map((user: { id: string }) => user.id)
const names = users.map((user: { name: string }) => user.name)
return {
success: true,
output: {
users,
ids,
names,
count: users.length,
},
}
},
outputs: {
users: {
type: 'array',
description: 'Array of user objects from the workspace',
items: {
type: 'object',
properties: USER_SUMMARY_OUTPUT_PROPERTIES,
},
},
ids: {
type: 'array',
description: 'Array of user IDs for easy access',
items: { type: 'string', description: 'User ID' },
},
names: {
type: 'array',
description: 'Array of usernames for easy access',
items: { type: 'string', description: 'Username' },
},
count: {
type: 'number',
description: 'Total number of users returned',
},
},
}