teamflect-mcp-server 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/.env.example +9 -0
  2. package/README.md +177 -0
  3. package/dist/constants.d.ts +9 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +9 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/index.d.ts +9 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +85 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/services/apiClient.d.ts +29 -0
  12. package/dist/services/apiClient.d.ts.map +1 -0
  13. package/dist/services/apiClient.js +92 -0
  14. package/dist/services/apiClient.js.map +1 -0
  15. package/dist/services/errorHandler.d.ts +5 -0
  16. package/dist/services/errorHandler.d.ts.map +1 -0
  17. package/dist/services/errorHandler.js +93 -0
  18. package/dist/services/errorHandler.js.map +1 -0
  19. package/dist/tools/feedbacks.d.ts +7 -0
  20. package/dist/tools/feedbacks.d.ts.map +1 -0
  21. package/dist/tools/feedbacks.js +372 -0
  22. package/dist/tools/feedbacks.js.map +1 -0
  23. package/dist/tools/goals.d.ts +7 -0
  24. package/dist/tools/goals.d.ts.map +1 -0
  25. package/dist/tools/goals.js +466 -0
  26. package/dist/tools/goals.js.map +1 -0
  27. package/dist/tools/recognitions.d.ts +7 -0
  28. package/dist/tools/recognitions.d.ts.map +1 -0
  29. package/dist/tools/recognitions.js +314 -0
  30. package/dist/tools/recognitions.js.map +1 -0
  31. package/dist/tools/reviews.d.ts +7 -0
  32. package/dist/tools/reviews.d.ts.map +1 -0
  33. package/dist/tools/reviews.js +224 -0
  34. package/dist/tools/reviews.js.map +1 -0
  35. package/dist/tools/tasks.d.ts +7 -0
  36. package/dist/tools/tasks.d.ts.map +1 -0
  37. package/dist/tools/tasks.js +262 -0
  38. package/dist/tools/tasks.js.map +1 -0
  39. package/dist/tools/users.d.ts +7 -0
  40. package/dist/tools/users.d.ts.map +1 -0
  41. package/dist/tools/users.js +417 -0
  42. package/dist/tools/users.js.map +1 -0
  43. package/dist/types.d.ts +284 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +9 -0
  46. package/dist/types.js.map +1 -0
  47. package/package.json +63 -0
@@ -0,0 +1,417 @@
1
+ import { z } from "zod";
2
+ import { handleApiError } from "../services/errorHandler.js";
3
+ import { ResponseFormat } from "../types.js";
4
+ import { DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE, CHARACTER_LIMIT } from "../constants.js";
5
+ /**
6
+ * Register user-related tools
7
+ */
8
+ export function registerUserTools(server, apiClient) {
9
+ // Get Users Schema
10
+ const GetUsersInputSchema = z.object({
11
+ attributeLabel: z.string().optional().describe("Label or key of the attribute to filter by (e.g., 'department', 'jobTitle')"),
12
+ attributeValue: z.string().optional().describe("Value of the attribute to filter by. Required when attributeLabel is provided"),
13
+ page: z.number().int().min(1).default(1)
14
+ .describe("1-based page number for paginated results"),
15
+ pageSize: z.number().int().min(1).max(MAX_PAGE_SIZE).default(DEFAULT_PAGE_SIZE)
16
+ .describe(`Number of users returned per page (max ${MAX_PAGE_SIZE}, default: ${DEFAULT_PAGE_SIZE})`),
17
+ response_format: z.nativeEnum(ResponseFormat).default(ResponseFormat.MARKDOWN)
18
+ .describe("Output format: 'markdown' for human-readable or 'json' for machine-readable"),
19
+ }).strict().refine((data) => !data.attributeLabel || data.attributeValue, {
20
+ message: "attributeValue is required when attributeLabel is provided",
21
+ path: ["attributeValue"],
22
+ });
23
+ server.registerTool("teamflect_get_users", {
24
+ title: "Get Users",
25
+ description: `Retrieve a list of users from Teamflect based on filters.
26
+
27
+ This tool searches for users matching the specified criteria. You can filter by user attributes like department or job title. Results are paginated using server-side pagination.
28
+
29
+ Args:
30
+ - attributeLabel (string, optional): Label or key of the attribute to filter by (e.g., 'department', 'jobTitle')
31
+ - attributeValue (string, optional): Value of the attribute to filter by. Required when attributeLabel is provided
32
+ - page (number, optional): 1-based page number for paginated results (default: 1)
33
+ - pageSize (number, optional): Number of users returned per page, between 1-${MAX_PAGE_SIZE} (default: ${DEFAULT_PAGE_SIZE})
34
+ - response_format ('markdown' | 'json', optional): Output format (default: 'markdown')
35
+
36
+ Returns:
37
+ For JSON format: Structured data with schema:
38
+ {
39
+ "total": number,
40
+ "count": number,
41
+ "page": number,
42
+ "pageSize": number,
43
+ "users": [
44
+ {
45
+ "mail": string,
46
+ "displayName": string,
47
+ "jobTitle": string,
48
+ "department": string,
49
+ "role": {"id": string, "name": string},
50
+ "isActive": boolean
51
+ }
52
+ ],
53
+ "has_more": boolean,
54
+ "next_page": number
55
+ }
56
+
57
+ Examples:
58
+ - Use when: "Get all users in Engineering department" -> params with attributeLabel="department", attributeValue="Engineering"
59
+ - Use when: "Get 500 users per page" -> params with pageSize=500
60
+ - Use when: "List users page 2" -> params with page=2
61
+
62
+ Error Handling:
63
+ - Returns "Error: Authentication failed" if API key is invalid
64
+ - Returns "Error: Rate limit exceeded" if too many requests`,
65
+ inputSchema: GetUsersInputSchema,
66
+ annotations: {
67
+ readOnlyHint: true,
68
+ destructiveHint: false,
69
+ idempotentHint: true,
70
+ openWorldHint: true,
71
+ },
72
+ }, async (params) => {
73
+ try {
74
+ // Build query parameters according to API documentation
75
+ const queryParams = {
76
+ page: params.page,
77
+ pageSize: params.pageSize,
78
+ };
79
+ // Add filtering parameters if provided
80
+ if (params.attributeLabel) {
81
+ queryParams.attributeLabel = params.attributeLabel;
82
+ }
83
+ if (params.attributeValue) {
84
+ queryParams.attributeValue = params.attributeValue;
85
+ }
86
+ // Call API with server-side pagination and filtering
87
+ const response = await apiClient.get("/user/getUsers", queryParams);
88
+ // Handle response - could be array or paginated object
89
+ let users = [];
90
+ let total = 0;
91
+ let hasMore = false;
92
+ let nextPage = undefined;
93
+ if (Array.isArray(response)) {
94
+ // Simple array response
95
+ users = response;
96
+ total = response.length;
97
+ hasMore = response.length === params.pageSize;
98
+ nextPage = hasMore ? params.page + 1 : undefined;
99
+ }
100
+ else if (response.users || response.data) {
101
+ // Paginated response object
102
+ users = response.users || response.data || [];
103
+ total = response.total || response.count || users.length;
104
+ hasMore = response.hasMore !== undefined ? response.hasMore : (users.length === params.pageSize);
105
+ nextPage = hasMore ? params.page + 1 : undefined;
106
+ }
107
+ else {
108
+ // Fallback: treat entire response as array
109
+ users = [response];
110
+ total = 1;
111
+ }
112
+ const output = {
113
+ total,
114
+ count: users.length,
115
+ page: params.page,
116
+ pageSize: params.pageSize,
117
+ users: users.map((user) => ({
118
+ mail: user.mail || user.userPrincipalName || "",
119
+ displayName: user.displayName || user.name || "",
120
+ jobTitle: user.jobTitle || "",
121
+ department: user.department || "",
122
+ officeLocation: user.officeLocation || "",
123
+ role: user.role ? (typeof user.role === 'object' ? user.role : { id: user.role, name: user.role }) : null,
124
+ isActive: user.isActive !== undefined ? user.isActive : (user.isRegisteredToTeamflect !== false),
125
+ })),
126
+ has_more: hasMore,
127
+ ...(nextPage !== undefined ? { next_page: nextPage } : {}),
128
+ };
129
+ let textContent;
130
+ if (params.response_format === ResponseFormat.MARKDOWN) {
131
+ const lines = [`# Users (${total} total)`, ""];
132
+ if (users.length === 0) {
133
+ lines.push("No users found matching the criteria.");
134
+ }
135
+ else {
136
+ lines.push(`Showing page ${params.page} (${users.length} of ${total} users)\n`);
137
+ users.forEach((user) => {
138
+ const email = user.mail || user.userPrincipalName || "";
139
+ const displayName = user.displayName || user.name || "";
140
+ lines.push(`## ${displayName} (${email})`);
141
+ if (user.jobTitle)
142
+ lines.push(`- **Job Title**: ${user.jobTitle}`);
143
+ if (user.department)
144
+ lines.push(`- **Department**: ${user.department}`);
145
+ if (user.officeLocation)
146
+ lines.push(`- **Office Location**: ${user.officeLocation}`);
147
+ if (user.role) {
148
+ const roleName = typeof user.role === 'object' ? user.role.name : user.role;
149
+ lines.push(`- **Role**: ${roleName}`);
150
+ }
151
+ const isActive = user.isActive !== undefined ? user.isActive : (user.isRegisteredToTeamflect !== false);
152
+ lines.push(`- **Active**: ${isActive ? "Yes" : "No"}`);
153
+ lines.push("");
154
+ });
155
+ if (hasMore && nextPage) {
156
+ lines.push(`\n*Use page=${nextPage} to get more results*`);
157
+ }
158
+ }
159
+ textContent = lines.join("\n");
160
+ }
161
+ else {
162
+ textContent = JSON.stringify(output, null, 2);
163
+ }
164
+ // Check character limit
165
+ if (textContent.length > CHARACTER_LIMIT) {
166
+ const truncated = output.users.slice(0, Math.floor(output.users.length / 2));
167
+ const truncatedOutput = { ...output, users: truncated, truncated: true };
168
+ textContent = params.response_format === ResponseFormat.MARKDOWN
169
+ ? `# Users (Truncated)\n\nResponse truncated from ${output.users.length} to ${truncated.length} users. Use filters or pagination to see more results.\n\n${JSON.stringify(truncatedOutput, null, 2)}`
170
+ : JSON.stringify(truncatedOutput, null, 2);
171
+ }
172
+ return {
173
+ content: [{ type: "text", text: textContent }],
174
+ structuredContent: output,
175
+ };
176
+ }
177
+ catch (error) {
178
+ return {
179
+ content: [{
180
+ type: "text",
181
+ text: handleApiError(error),
182
+ }],
183
+ };
184
+ }
185
+ });
186
+ // Get User Schema
187
+ const GetUserInputSchema = z.object({
188
+ userMail: z.string().email().describe("Email address of the user to retrieve"),
189
+ response_format: z.nativeEnum(ResponseFormat).default(ResponseFormat.MARKDOWN)
190
+ .describe("Output format: 'markdown' for human-readable or 'json' for machine-readable"),
191
+ }).strict();
192
+ server.registerTool("teamflect_get_user", {
193
+ title: "Get User by Email",
194
+ description: `Retrieve a single user by their email address from Teamflect.
195
+
196
+ This tool fetches detailed information about a specific user including their role, department, and status.
197
+
198
+ Args:
199
+ - userMail (string, required): Email address of the user
200
+ - response_format ('markdown' | 'json', optional): Output format (default: 'markdown')
201
+
202
+ Returns:
203
+ Complete user details including all fields.
204
+
205
+ Error Handling:
206
+ - Returns "Error: Resource not found" if userMail is not found in the tenant
207
+ - Returns "Error: Authentication failed" if API key is invalid`,
208
+ inputSchema: GetUserInputSchema,
209
+ annotations: {
210
+ readOnlyHint: true,
211
+ destructiveHint: false,
212
+ idempotentHint: true,
213
+ openWorldHint: true,
214
+ },
215
+ }, async (params) => {
216
+ try {
217
+ const user = await apiClient.get("/user/getUser", { userMail: params.userMail });
218
+ let textContent;
219
+ if (params.response_format === ResponseFormat.MARKDOWN) {
220
+ const lines = [`# ${user.displayName}`, "", `**Email**: ${user.mail}`, ""];
221
+ if (user.jobTitle)
222
+ lines.push(`- **Job Title**: ${user.jobTitle}`);
223
+ if (user.department)
224
+ lines.push(`- **Department**: ${user.department}`);
225
+ if (user.officeLocation)
226
+ lines.push(`- **Office Location**: ${user.officeLocation}`);
227
+ if (user.role)
228
+ lines.push(`- **Role**: ${user.role.name} (${user.role.id})`);
229
+ lines.push(`- **Active**: ${user.isActive !== false ? "Yes" : "No"}`);
230
+ textContent = lines.join("\n");
231
+ }
232
+ else {
233
+ textContent = JSON.stringify(user, null, 2);
234
+ }
235
+ return {
236
+ content: [{ type: "text", text: textContent }],
237
+ structuredContent: user,
238
+ };
239
+ }
240
+ catch (error) {
241
+ return {
242
+ content: [{
243
+ type: "text",
244
+ text: handleApiError(error),
245
+ }],
246
+ };
247
+ }
248
+ });
249
+ // Update User Schema
250
+ const UpdateUserInputSchema = z.object({
251
+ email: z.string().email().describe("Email address of the user to update"),
252
+ displayName: z.string().min(1).max(200).optional().describe("New display name (1-200 characters)"),
253
+ jobTitle: z.string().max(200).optional().describe("New job title"),
254
+ department: z.string().max(200).optional().describe("New department name"),
255
+ officeLocation: z.string().max(200).optional().describe("New office location"),
256
+ response_format: z.nativeEnum(ResponseFormat).default(ResponseFormat.MARKDOWN)
257
+ .describe("Output format: 'markdown' for human-readable or 'json' for machine-readable"),
258
+ }).strict();
259
+ server.registerTool("teamflect_update_user", {
260
+ title: "Update User",
261
+ description: `Update an existing user in Teamflect.
262
+
263
+ This tool updates user attributes. Only provided fields will be updated.
264
+
265
+ Args:
266
+ - email (string, required): Email address of the user to update
267
+ - displayName (string, optional): New display name (1-200 characters)
268
+ - jobTitle (string, optional): New job title
269
+ - department (string, optional): New department name
270
+ - officeLocation (string, optional): New office location
271
+ - response_format ('markdown' | 'json', optional): Output format (default: 'markdown')
272
+
273
+ Returns:
274
+ The updated user with all details.
275
+
276
+ Error Handling:
277
+ - Returns "Error: Resource not found" if email doesn't exist
278
+ - Returns "Error: Permission denied" if you don't have permission to update users`,
279
+ inputSchema: UpdateUserInputSchema,
280
+ annotations: {
281
+ readOnlyHint: false,
282
+ destructiveHint: false,
283
+ idempotentHint: false,
284
+ openWorldHint: true,
285
+ },
286
+ }, async (params) => {
287
+ try {
288
+ // API expects userAttributes as an array of objects with label and value
289
+ const userAttributes = [];
290
+ if (params.displayName !== undefined)
291
+ userAttributes.push({ label: "displayName", value: params.displayName });
292
+ if (params.jobTitle !== undefined)
293
+ userAttributes.push({ label: "jobTitle", value: params.jobTitle });
294
+ if (params.department !== undefined)
295
+ userAttributes.push({ label: "department", value: params.department });
296
+ if (params.officeLocation !== undefined)
297
+ userAttributes.push({ label: "officeLocation", value: params.officeLocation });
298
+ const requestBody = {
299
+ userMail: params.email,
300
+ userAttributes: userAttributes,
301
+ };
302
+ const user = await apiClient.post("/user/updateUser", requestBody);
303
+ let textContent;
304
+ if (params.response_format === ResponseFormat.MARKDOWN) {
305
+ textContent = `# User Updated\n\nUser updated successfully.\n\n- **Name**: ${user.displayName}\n- **Email**: ${user.mail}\n${user.jobTitle ? `- **Job Title**: ${user.jobTitle}\n` : ""}${user.department ? `- **Department**: ${user.department}\n` : ""}`;
306
+ }
307
+ else {
308
+ textContent = JSON.stringify(user, null, 2);
309
+ }
310
+ return {
311
+ content: [{ type: "text", text: textContent }],
312
+ structuredContent: user,
313
+ };
314
+ }
315
+ catch (error) {
316
+ return {
317
+ content: [{
318
+ type: "text",
319
+ text: handleApiError(error),
320
+ }],
321
+ };
322
+ }
323
+ });
324
+ // Get Roles Schema
325
+ const GetRolesInputSchema = z.object({
326
+ response_format: z.nativeEnum(ResponseFormat).default(ResponseFormat.MARKDOWN)
327
+ .describe("Output format: 'markdown' for human-readable or 'json' for machine-readable"),
328
+ }).strict();
329
+ server.registerTool("teamflect_get_roles", {
330
+ title: "Get User Roles",
331
+ description: `Retrieve a list of available user roles in Teamflect.
332
+
333
+ This tool returns all roles that can be assigned to users, such as Administrator, Manager, Employee, etc.
334
+
335
+ Args:
336
+ - response_format ('markdown' | 'json', optional): Output format (default: 'markdown')
337
+
338
+ Returns:
339
+ List of available roles with their IDs and names.
340
+
341
+ Error Handling:
342
+ - Returns "Error: Authentication failed" if API key is invalid`,
343
+ inputSchema: GetRolesInputSchema,
344
+ annotations: {
345
+ readOnlyHint: true,
346
+ destructiveHint: false,
347
+ idempotentHint: true,
348
+ openWorldHint: true,
349
+ },
350
+ }, async (params) => {
351
+ try {
352
+ const rolesResponse = await apiClient.get("/user/getRoles");
353
+ // Handle both array response and object response formats
354
+ let rolesArray = Array.isArray(rolesResponse)
355
+ ? rolesResponse
356
+ : rolesResponse.roles || [];
357
+ // API returns roles with structure: { key: string, value: number, classification: string }
358
+ // Normalize roles to ensure they have id and name properties
359
+ const roles = rolesArray.map((role, index) => {
360
+ // Handle different response formats
361
+ if (typeof role === 'string') {
362
+ return { id: role, name: role };
363
+ }
364
+ else if (typeof role === 'number') {
365
+ return { id: String(role), name: String(role) };
366
+ }
367
+ else if (role && typeof role === 'object') {
368
+ // API structure: { key: string, value: number, classification: string }
369
+ const id = role.key || role.id || role.roleId || String(role.value !== undefined ? role.value : index);
370
+ const name = role.key || role.name || role.roleName || role.label || String(role.value !== undefined ? role.value : index);
371
+ const description = role.classification || role.description;
372
+ return {
373
+ id: String(id),
374
+ name: String(name),
375
+ description: description ? String(description) : undefined
376
+ };
377
+ }
378
+ else {
379
+ return { id: String(index), name: `Role ${index + 1}` };
380
+ }
381
+ });
382
+ let textContent;
383
+ if (params.response_format === ResponseFormat.MARKDOWN) {
384
+ const lines = [`# Available Roles (${roles.length})`, ""];
385
+ if (roles.length === 0) {
386
+ lines.push("No roles found.");
387
+ }
388
+ else {
389
+ roles.forEach((role) => {
390
+ lines.push(`## ${role.name} (${role.id})`);
391
+ if (role.description) {
392
+ lines.push(`*${role.description}*`);
393
+ }
394
+ lines.push("");
395
+ });
396
+ }
397
+ textContent = lines.join("\n");
398
+ }
399
+ else {
400
+ textContent = JSON.stringify(roles, null, 2);
401
+ }
402
+ return {
403
+ content: [{ type: "text", text: textContent }],
404
+ structuredContent: { roles },
405
+ };
406
+ }
407
+ catch (error) {
408
+ return {
409
+ content: [{
410
+ type: "text",
411
+ text: handleApiError(error),
412
+ }],
413
+ };
414
+ }
415
+ });
416
+ }
417
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"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"}