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,372 @@
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 feedback-related tools
7
+ */
8
+ export function registerFeedbackTools(server, apiClient) {
9
+ // Get Feedbacks Schema
10
+ const GetFeedbacksInputSchema = z.object({
11
+ status: z.string().optional().describe("Filter by feedback status"),
12
+ aboutEmail: z.string().email().optional().describe("Filter by the person the feedback is about"),
13
+ submittedByEmail: z.string().email().optional().describe("Filter by the person who submitted the feedback"),
14
+ startDate: z.string().optional().describe("Filter by submission start date (ISO format)"),
15
+ endDate: z.string().optional().describe("Filter by submission end date (ISO format)"),
16
+ limit: z.number().int().min(1).max(MAX_PAGE_SIZE).default(DEFAULT_PAGE_SIZE)
17
+ .describe("Maximum number of feedbacks to return"),
18
+ offset: z.number().int().min(0).default(0)
19
+ .describe("Number of feedbacks to skip for pagination"),
20
+ response_format: z.nativeEnum(ResponseFormat).default(ResponseFormat.MARKDOWN)
21
+ .describe("Output format: 'markdown' for human-readable or 'json' for machine-readable"),
22
+ }).strict();
23
+ server.registerTool("teamflect_get_feedbacks", {
24
+ title: "Get Feedbacks",
25
+ description: `Retrieve a list of feedbacks from Teamflect based on filters.
26
+
27
+ This tool searches for feedbacks matching the specified criteria. You can filter by status, the person the feedback is about, who submitted it, and date ranges. Results are paginated.
28
+
29
+ Args:
30
+ - status (string, optional): Filter by feedback status
31
+ - aboutEmail (string, optional): Filter by the person the feedback is about (email address)
32
+ - submittedByEmail (string, optional): Filter by the person who submitted the feedback (email address)
33
+ - startDate (string, optional): Filter by submission start date in ISO format (YYYY-MM-DD)
34
+ - endDate (string, optional): Filter by submission end date in ISO format (YYYY-MM-DD)
35
+ - limit (number, optional): Maximum results to return, between 1-300 (default: 20)
36
+ - offset (number, optional): Number of results to skip for pagination (default: 0)
37
+ - response_format ('markdown' | 'json', optional): Output format (default: 'markdown')
38
+
39
+ Returns:
40
+ For JSON format: Structured data with schema:
41
+ {
42
+ "total": number,
43
+ "count": number,
44
+ "offset": number,
45
+ "feedbacks": [
46
+ {
47
+ "feedbackId": string,
48
+ "about": {"displayName": string, "mail": string},
49
+ "status": string,
50
+ "submittedBy": {"displayName": string},
51
+ "createdAt": string,
52
+ "submittedAt": string,
53
+ "questions": [
54
+ {
55
+ "question": string,
56
+ "answer": string,
57
+ "additionalAnswer": string,
58
+ "questionType": string
59
+ }
60
+ ]
61
+ }
62
+ ],
63
+ "has_more": boolean,
64
+ "next_offset": number
65
+ }
66
+
67
+ Examples:
68
+ - Use when: "Get all feedbacks about john@example.com" -> params with aboutEmail="john@example.com"
69
+ - Use when: "List feedbacks submitted this month" -> params with startDate/endDate filters
70
+
71
+ Error Handling:
72
+ - Returns "Error: Authentication failed" if API key is invalid
73
+ - Returns "Error: Rate limit exceeded" if too many requests`,
74
+ inputSchema: GetFeedbacksInputSchema,
75
+ annotations: {
76
+ readOnlyHint: true,
77
+ destructiveHint: false,
78
+ idempotentHint: true,
79
+ openWorldHint: true,
80
+ },
81
+ }, async (params) => {
82
+ try {
83
+ // API doesn't accept query parameters - fetch all and filter client-side
84
+ const response = await apiClient.get("/feedback/getFeedbacks");
85
+ // Handle both array response and object response formats
86
+ let allFeedbacks = Array.isArray(response)
87
+ ? response
88
+ : response.feedbacks || [];
89
+ // Apply client-side filtering
90
+ let feedbacks = allFeedbacks;
91
+ if (params.aboutEmail) {
92
+ feedbacks = feedbacks.filter((f) => {
93
+ const aboutEmail = f.about?.mail || f.about?.userPrincipalName || "";
94
+ return aboutEmail.toLowerCase() === params.aboutEmail.toLowerCase();
95
+ });
96
+ }
97
+ if (params.submittedByEmail) {
98
+ feedbacks = feedbacks.filter((f) => {
99
+ const submittedEmail = f.submittedBy?.userPrincipalName || f.submittedBy?.mail || "";
100
+ return submittedEmail.toLowerCase() === params.submittedByEmail.toLowerCase();
101
+ });
102
+ }
103
+ if (params.status) {
104
+ feedbacks = feedbacks.filter((f) => f.status?.toLowerCase() === params.status.toLowerCase());
105
+ }
106
+ if (params.startDate) {
107
+ const start = new Date(params.startDate);
108
+ feedbacks = feedbacks.filter((f) => {
109
+ const createdAt = f.createdAt ? new Date(f.createdAt) : null;
110
+ return createdAt && createdAt >= start;
111
+ });
112
+ }
113
+ if (params.endDate) {
114
+ const end = new Date(params.endDate);
115
+ feedbacks = feedbacks.filter((f) => {
116
+ const createdAt = f.createdAt ? new Date(f.createdAt) : null;
117
+ return createdAt && createdAt <= end;
118
+ });
119
+ }
120
+ // Calculate total before pagination
121
+ const total = feedbacks.length;
122
+ // Apply pagination after filtering
123
+ const startIndex = params.offset;
124
+ const endIndex = startIndex + params.limit;
125
+ feedbacks = feedbacks.slice(startIndex, endIndex);
126
+ const hasMore = total > params.offset + feedbacks.length;
127
+ const nextOffset = hasMore ? params.offset + feedbacks.length : undefined;
128
+ const output = {
129
+ total,
130
+ count: feedbacks.length,
131
+ offset: params.offset,
132
+ feedbacks: feedbacks.map((feedback) => ({
133
+ feedbackId: feedback.id || feedback.feedbackId || "",
134
+ about: feedback.about ? {
135
+ displayName: feedback.about.displayName || "",
136
+ mail: feedback.about.mail || feedback.about.userPrincipalName || ""
137
+ } : null,
138
+ status: feedback.status || "",
139
+ submittedBy: feedback.submittedBy ? {
140
+ displayName: feedback.submittedBy.displayName || ""
141
+ } : null,
142
+ createdAt: feedback.createdAt || "",
143
+ submittedAt: feedback.submittedAt || "",
144
+ questions: feedback.questions || [],
145
+ })),
146
+ has_more: hasMore,
147
+ ...(nextOffset !== undefined ? { next_offset: nextOffset } : {}),
148
+ };
149
+ let textContent;
150
+ if (params.response_format === ResponseFormat.MARKDOWN) {
151
+ const lines = [`# Feedbacks (${total} total)`, ""];
152
+ if (feedbacks.length === 0) {
153
+ lines.push("No feedbacks found matching the criteria.");
154
+ }
155
+ else {
156
+ lines.push(`Showing ${feedbacks.length} of ${total} feedbacks\n`);
157
+ feedbacks.forEach((feedback) => {
158
+ const feedbackId = feedback.id || feedback.feedbackId || "N/A";
159
+ lines.push(`## Feedback ${feedbackId}`);
160
+ if (feedback.about) {
161
+ const aboutEmail = feedback.about.mail || feedback.about.userPrincipalName || "";
162
+ lines.push(`- **About**: ${feedback.about.displayName || ""} (${aboutEmail})`);
163
+ }
164
+ lines.push(`- **Status**: ${feedback.status || ""}`);
165
+ if (feedback.submittedBy) {
166
+ lines.push(`- **Submitted By**: ${feedback.submittedBy.displayName || ""}`);
167
+ }
168
+ if (feedback.submittedAt) {
169
+ lines.push(`- **Submitted At**: ${feedback.submittedAt}`);
170
+ }
171
+ if (feedback.createdAt) {
172
+ lines.push(`- **Created At**: ${feedback.createdAt}`);
173
+ }
174
+ if (feedback.questions && feedback.questions.length > 0) {
175
+ lines.push("\n**Questions & Answers:**");
176
+ feedback.questions.forEach((q) => {
177
+ lines.push(`- **Q**: ${q.question || ""}`);
178
+ if (q.answer)
179
+ lines.push(` **A**: ${q.answer}`);
180
+ if (q.additionalAnswer)
181
+ lines.push(` **Additional**: ${q.additionalAnswer}`);
182
+ });
183
+ }
184
+ lines.push("");
185
+ });
186
+ if (hasMore) {
187
+ lines.push(`\n*Use offset=${nextOffset} to get more results*`);
188
+ }
189
+ }
190
+ textContent = lines.join("\n");
191
+ }
192
+ else {
193
+ textContent = JSON.stringify(output, null, 2);
194
+ }
195
+ // Check character limit
196
+ if (textContent.length > CHARACTER_LIMIT) {
197
+ const truncated = output.feedbacks.slice(0, Math.floor(output.feedbacks.length / 2));
198
+ const truncatedOutput = { ...output, feedbacks: truncated, truncated: true };
199
+ textContent = params.response_format === ResponseFormat.MARKDOWN
200
+ ? `# Feedbacks (Truncated)\n\nResponse truncated from ${output.feedbacks.length} to ${truncated.length} feedbacks. Use filters or pagination to see more results.\n\n${JSON.stringify(truncatedOutput, null, 2)}`
201
+ : JSON.stringify(truncatedOutput, null, 2);
202
+ }
203
+ return {
204
+ content: [{ type: "text", text: textContent }],
205
+ structuredContent: output,
206
+ };
207
+ }
208
+ catch (error) {
209
+ return {
210
+ content: [{
211
+ type: "text",
212
+ text: handleApiError(error),
213
+ }],
214
+ };
215
+ }
216
+ });
217
+ // Send Feedback Request Schema
218
+ const SendFeedbackRequestInputSchema = z.object({
219
+ aboutEmail: z.string().email().describe("Email address of the person the feedback is about"),
220
+ questions: z.array(z.object({
221
+ question: z.string().min(1).max(1000).describe("Question text"),
222
+ questionType: z.string().describe("Question type (e.g., 'Text', 'Rating', 'YesNo')"),
223
+ })).min(1).describe("Array of questions to ask"),
224
+ dueDate: z.string().optional().describe("Due date for feedback submission in ISO format (YYYY-MM-DD)"),
225
+ response_format: z.nativeEnum(ResponseFormat).default(ResponseFormat.MARKDOWN)
226
+ .describe("Output format: 'markdown' for human-readable or 'json' for machine-readable"),
227
+ }).strict();
228
+ server.registerTool("teamflect_send_feedback_request", {
229
+ title: "Send Feedback Request",
230
+ description: `Send a new feedback request in Teamflect.
231
+
232
+ This tool creates and sends a feedback request to collect feedback about a person. The request includes questions that need to be answered.
233
+
234
+ Args:
235
+ - aboutEmail (string, required): Email address of the person the feedback is about
236
+ - questions (array, required): Array of question objects, each with:
237
+ - question (string): Question text (1-1000 characters)
238
+ - questionType (string): Question type identifier
239
+ - dueDate (string, optional): Due date for feedback submission in ISO format (YYYY-MM-DD)
240
+ - response_format ('markdown' | 'json', optional): Output format (default: 'markdown')
241
+
242
+ Returns:
243
+ The created feedback request with its ID and status.
244
+
245
+ Error Handling:
246
+ - Returns "Error: Bad request" if required fields are missing or invalid
247
+ - Returns "Error: Permission denied" if you don't have permission to send feedback requests`,
248
+ inputSchema: SendFeedbackRequestInputSchema,
249
+ annotations: {
250
+ readOnlyHint: false,
251
+ destructiveHint: false,
252
+ idempotentHint: false,
253
+ openWorldHint: true,
254
+ },
255
+ }, async (params) => {
256
+ try {
257
+ const requestBody = {
258
+ feedbackAboutUPNorId: params.aboutEmail,
259
+ feedbackRequestReceiverUPNorId: params.aboutEmail, // Receiver is same as about person for internal feedback
260
+ questions: params.questions,
261
+ dueDate: params.dueDate,
262
+ };
263
+ const feedback = await apiClient.post("/feedback/sendFeedbackRequest", requestBody);
264
+ let textContent;
265
+ if (params.response_format === ResponseFormat.MARKDOWN) {
266
+ textContent = `# Feedback Request Sent\n\nFeedback request created successfully.\n\n- **Feedback ID**: ${feedback.feedbackId}\n- **Status**: ${feedback.status}\n- **About**: ${feedback.about?.displayName || params.aboutEmail}\n- **Questions**: ${params.questions.length} question(s)`;
267
+ }
268
+ else {
269
+ textContent = JSON.stringify(feedback, null, 2);
270
+ }
271
+ return {
272
+ content: [{ type: "text", text: textContent }],
273
+ structuredContent: feedback,
274
+ };
275
+ }
276
+ catch (error) {
277
+ return {
278
+ content: [{
279
+ type: "text",
280
+ text: handleApiError(error),
281
+ }],
282
+ };
283
+ }
284
+ });
285
+ // Send External Feedback Request Schema
286
+ const SendExternalFeedbackRequestInputSchema = z.object({
287
+ aboutEmail: z.string().email().describe("Email address of the person the feedback is about"),
288
+ externalEmail: z.string().email().describe("Email address of the external person to request feedback from"),
289
+ questions: z.array(z.object({
290
+ question: z.string().min(1).max(1000).describe("Question text"),
291
+ questionType: z.string().describe("Question type (e.g., 'Text', 'Rating', 'YesNo')"),
292
+ })).min(1).describe("Array of questions to ask"),
293
+ dueDateInDays: z.number().int().min(1).describe("Due date in days from now (e.g., 7 for 7 days)"),
294
+ dueDate: z.string().optional().describe("Due date for feedback submission in ISO format (YYYY-MM-DD) - will be converted to dueDateInDays"),
295
+ response_format: z.nativeEnum(ResponseFormat).default(ResponseFormat.MARKDOWN)
296
+ .describe("Output format: 'markdown' for human-readable or 'json' for machine-readable"),
297
+ }).strict();
298
+ server.registerTool("teamflect_send_external_feedback_request", {
299
+ title: "Send External Feedback Request",
300
+ description: `Send a new external feedback request in Teamflect.
301
+
302
+ This tool creates and sends a feedback request to an external person (someone outside your organization) to collect feedback about a person.
303
+
304
+ Args:
305
+ - aboutEmail (string, required): Email address of the person the feedback is about
306
+ - externalEmail (string, required): Email address of the external person to request feedback from
307
+ - questions (array, required): Array of question objects, each with:
308
+ - question (string): Question text (1-1000 characters)
309
+ - questionType (string): Question type identifier
310
+ - dueDate (string, optional): Due date for feedback submission in ISO format (YYYY-MM-DD)
311
+ - response_format ('markdown' | 'json', optional): Output format (default: 'markdown')
312
+
313
+ Returns:
314
+ The created external feedback request with its ID and status.
315
+
316
+ Error Handling:
317
+ - Returns "Error: Bad request" if required fields are missing or invalid
318
+ - Returns "Error: Permission denied" if you don't have permission to send external feedback requests`,
319
+ inputSchema: SendExternalFeedbackRequestInputSchema,
320
+ annotations: {
321
+ readOnlyHint: false,
322
+ destructiveHint: false,
323
+ idempotentHint: false,
324
+ openWorldHint: true,
325
+ },
326
+ }, async (params) => {
327
+ try {
328
+ const requestBody = {
329
+ feedbackAboutUPNorId: params.aboutEmail,
330
+ externalEmail: params.externalEmail,
331
+ questions: params.questions,
332
+ };
333
+ // Use dueDateInDays if provided, otherwise convert dueDate to days
334
+ if (params.dueDateInDays !== undefined) {
335
+ requestBody.dueDateInDays = params.dueDateInDays;
336
+ }
337
+ else if (params.dueDate) {
338
+ // Convert ISO date to days from now
339
+ const dueDate = new Date(params.dueDate);
340
+ const now = new Date();
341
+ const diffTime = dueDate.getTime() - now.getTime();
342
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
343
+ requestBody.dueDateInDays = Math.max(1, diffDays); // Ensure at least 1 day
344
+ }
345
+ else {
346
+ // Default to 7 days if neither provided
347
+ requestBody.dueDateInDays = 7;
348
+ }
349
+ const feedback = await apiClient.post("/feedback/sendExternalFeedbackRequest", requestBody);
350
+ let textContent;
351
+ if (params.response_format === ResponseFormat.MARKDOWN) {
352
+ textContent = `# External Feedback Request Sent\n\nExternal feedback request created successfully.\n\n- **Feedback ID**: ${feedback.feedbackId}\n- **Status**: ${feedback.status}\n- **About**: ${feedback.about?.displayName || params.aboutEmail}\n- **External Email**: ${params.externalEmail}\n- **Questions**: ${params.questions.length} question(s)`;
353
+ }
354
+ else {
355
+ textContent = JSON.stringify(feedback, null, 2);
356
+ }
357
+ return {
358
+ content: [{ type: "text", text: textContent }],
359
+ structuredContent: feedback,
360
+ };
361
+ }
362
+ catch (error) {
363
+ return {
364
+ content: [{
365
+ type: "text",
366
+ text: handleApiError(error),
367
+ }],
368
+ };
369
+ }
370
+ });
371
+ }
372
+ //# sourceMappingURL=feedbacks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedbacks.js","sourceRoot":"","sources":["../../src/tools/feedbacks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { TeamflectApiClient } from "../services/apiClient.js";
3
+ /**
4
+ * Register goal-related tools
5
+ */
6
+ export declare function registerGoalTools(server: McpServer, apiClient: TeamflectApiClient): void;
7
+ //# sourceMappingURL=goals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goals.d.ts","sourceRoot":"","sources":["../../src/tools/goals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAK9D;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,GAAG,IAAI,CA4exF"}