@teamso/teamso-mcp 0.0.0-stage → 1.2.0

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 (112) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/LICENSE +21 -0
  3. package/README.md +516 -2
  4. package/dist/client.d.ts +215 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +797 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/index.d.ts +3 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +32 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/prompts/index.d.ts +12 -0
  13. package/dist/prompts/index.d.ts.map +1 -0
  14. package/dist/prompts/index.js +58 -0
  15. package/dist/prompts/index.js.map +1 -0
  16. package/dist/server.d.ts +28 -0
  17. package/dist/server.d.ts.map +1 -0
  18. package/dist/server.js +58 -0
  19. package/dist/server.js.map +1 -0
  20. package/dist/tools/account.d.ts +4 -0
  21. package/dist/tools/account.d.ts.map +1 -0
  22. package/dist/tools/account.js +34 -0
  23. package/dist/tools/account.js.map +1 -0
  24. package/dist/tools/api.d.ts +13 -0
  25. package/dist/tools/api.d.ts.map +1 -0
  26. package/dist/tools/api.js +980 -0
  27. package/dist/tools/api.js.map +1 -0
  28. package/dist/tools/approvals.d.ts +5 -0
  29. package/dist/tools/approvals.d.ts.map +1 -0
  30. package/dist/tools/approvals.js +120 -0
  31. package/dist/tools/approvals.js.map +1 -0
  32. package/dist/tools/communication.d.ts +4 -0
  33. package/dist/tools/communication.d.ts.map +1 -0
  34. package/dist/tools/communication.js +39 -0
  35. package/dist/tools/communication.js.map +1 -0
  36. package/dist/tools/employees.d.ts +5 -0
  37. package/dist/tools/employees.d.ts.map +1 -0
  38. package/dist/tools/employees.js +113 -0
  39. package/dist/tools/employees.js.map +1 -0
  40. package/dist/tools/help.d.ts +6 -0
  41. package/dist/tools/help.d.ts.map +1 -0
  42. package/dist/tools/help.js +171 -0
  43. package/dist/tools/help.js.map +1 -0
  44. package/dist/tools/index.d.ts +86 -0
  45. package/dist/tools/index.d.ts.map +1 -0
  46. package/dist/tools/index.js +118 -0
  47. package/dist/tools/index.js.map +1 -0
  48. package/dist/tools/leave-support.d.ts +60 -0
  49. package/dist/tools/leave-support.d.ts.map +1 -0
  50. package/dist/tools/leave-support.js +185 -0
  51. package/dist/tools/leave-support.js.map +1 -0
  52. package/dist/tools/leave.d.ts +14 -0
  53. package/dist/tools/leave.d.ts.map +1 -0
  54. package/dist/tools/leave.js +386 -0
  55. package/dist/tools/leave.js.map +1 -0
  56. package/dist/tools/payroll.d.ts +5 -0
  57. package/dist/tools/payroll.d.ts.map +1 -0
  58. package/dist/tools/payroll.js +101 -0
  59. package/dist/tools/payroll.js.map +1 -0
  60. package/dist/tools/performance.d.ts +13 -0
  61. package/dist/tools/performance.d.ts.map +1 -0
  62. package/dist/tools/performance.js +592 -0
  63. package/dist/tools/performance.js.map +1 -0
  64. package/dist/tools/schemas.d.ts +2079 -0
  65. package/dist/tools/schemas.d.ts.map +1 -0
  66. package/dist/tools/schemas.js +460 -0
  67. package/dist/tools/schemas.js.map +1 -0
  68. package/dist/tools/shared.d.ts +20 -0
  69. package/dist/tools/shared.d.ts.map +1 -0
  70. package/dist/tools/shared.js +64 -0
  71. package/dist/tools/shared.js.map +1 -0
  72. package/dist/types.d.ts +545 -0
  73. package/dist/types.d.ts.map +1 -0
  74. package/dist/types.js +7 -0
  75. package/dist/types.js.map +1 -0
  76. package/dist/utils/api-endpoints.d.ts +130 -0
  77. package/dist/utils/api-endpoints.d.ts.map +1 -0
  78. package/dist/utils/api-endpoints.js +459 -0
  79. package/dist/utils/api-endpoints.js.map +1 -0
  80. package/dist/utils/dates.d.ts +27 -0
  81. package/dist/utils/dates.d.ts.map +1 -0
  82. package/dist/utils/dates.js +102 -0
  83. package/dist/utils/dates.js.map +1 -0
  84. package/dist/utils/format.d.ts +8 -0
  85. package/dist/utils/format.d.ts.map +1 -0
  86. package/dist/utils/format.js +26 -0
  87. package/dist/utils/format.js.map +1 -0
  88. package/dist/utils/help-search.d.ts +25 -0
  89. package/dist/utils/help-search.d.ts.map +1 -0
  90. package/dist/utils/help-search.js +93 -0
  91. package/dist/utils/help-search.js.map +1 -0
  92. package/dist/utils/json-schema-dialect.d.ts +12 -0
  93. package/dist/utils/json-schema-dialect.d.ts.map +1 -0
  94. package/dist/utils/json-schema-dialect.js +146 -0
  95. package/dist/utils/json-schema-dialect.js.map +1 -0
  96. package/dist/utils/results.d.ts +27 -0
  97. package/dist/utils/results.d.ts.map +1 -0
  98. package/dist/utils/results.js +88 -0
  99. package/dist/utils/results.js.map +1 -0
  100. package/dist/utils/structured.d.ts +89 -0
  101. package/dist/utils/structured.d.ts.map +1 -0
  102. package/dist/utils/structured.js +307 -0
  103. package/dist/utils/structured.js.map +1 -0
  104. package/dist/utils/text.d.ts +12 -0
  105. package/dist/utils/text.d.ts.map +1 -0
  106. package/dist/utils/text.js +46 -0
  107. package/dist/utils/text.js.map +1 -0
  108. package/dist/version.d.ts +3 -0
  109. package/dist/version.d.ts.map +1 -0
  110. package/dist/version.js +6 -0
  111. package/dist/version.js.map +1 -0
  112. package/package.json +86 -4
@@ -0,0 +1,386 @@
1
+ import { z } from 'zod';
2
+ import { parseWallClock } from '../utils/dates.js';
3
+ import { escapeCell, formatDateRange, formatDays, markdownTable, } from '../utils/format.js';
4
+ import { apiErrorResult, errorResult, toolResult, } from '../utils/results.js';
5
+ import { LEAVE_STATUSES, closedPayrollPeriodsOf, roundDays, toLeavePolicy, toLeaveSummary, toLeaveType, } from '../utils/structured.js';
6
+ import { explainLeaveReason, leaveOwnerId, leaveTypeIdOf, loadLeavePolicy, prepareLeaveRequest, scanLeaves, } from './leave-support.js';
7
+ import { leaveBalanceOutputSchema, leaveCalculationOutputSchema, leaveCancelledOutputSchema, leaveCreatedOutputSchema, leaveListOutputSchema, leaveTypesOutputSchema, otpOutputSchema, } from './schemas.js';
8
+ import { ADDITIVE_WRITE, DESTRUCTIVE_WRITE, READ_ONLY, idSchema, leaveDateSchema, otpCodeSchema, } from './shared.js';
9
+ const OTP_VALIDITY_SECONDS = 180;
10
+ const LEAVE_POLICY_HINTS = {
11
+ notFound: 'No leave types are set up in your leave policy. Ask your HR administrator.',
12
+ };
13
+ const OTP_HINTS = {
14
+ byCode: {
15
+ OTP_NOT_DONE: 'The SMS verification is missing or was already used. Call `request_leave_otp`, '
16
+ + 'ask the user for the new code, and retry with `otp_code`.',
17
+ 'validation error.The token is not correct.': 'The SMS code is wrong. Ask the user to check the '
18
+ + 'code, or call `request_leave_otp` for a new one.',
19
+ 'validation error.token is expired.': 'The SMS code has expired (codes are valid for 3 minutes). '
20
+ + 'Call `request_leave_otp` for a new code.',
21
+ 'Token Not Found': 'No SMS code is waiting for verification. Call `request_leave_otp` first.',
22
+ 'validation error.too many attempts.': 'Too many wrong SMS codes: this code is cancelled. Call '
23
+ + '`request_leave_otp` for a new one and ask the user for it.',
24
+ },
25
+ };
26
+ const leaveRequestInput = {
27
+ leave_type_id: idSchema('Leave type id from `list_leave_types`.'),
28
+ start: leaveDateSchema('start'),
29
+ end: leaveDateSchema('end'),
30
+ };
31
+ export function registerListLeaveTypes(server, client) {
32
+ server.registerTool('list_leave_types', {
33
+ title: 'List the leave types I can request',
34
+ description: 'List the leave types in the caller\'s leave policy with the remaining balance '
35
+ + '(`remainingDays`) and the rules of each type (per-request limits, document or '
36
+ + 'description requirements). Use the `id` as `leave_type_id` in the other leave tools.',
37
+ inputSchema: {},
38
+ outputSchema: leaveTypesOutputSchema,
39
+ annotations: READ_ONLY,
40
+ }, async (_args, extra) => {
41
+ try {
42
+ const context = await loadLeavePolicy(client, extra.signal);
43
+ const policy = toLeavePolicy(context.assignment);
44
+ const leaveTypes = context.balances.map(toLeaveType);
45
+ const table = markdownTable(['Leave type', 'Id', 'Remaining', 'Rules'], leaveTypes.map(type => [
46
+ type.isDefault ? `${type.name} (default)` : type.name,
47
+ `\`${type.id}\``,
48
+ formatDays(type.remainingDays),
49
+ leaveTypeRules(type).join('; '),
50
+ ]));
51
+ return toolResult(`## Leave types — ${policy.name ?? 'your policy'}\n\n${table}`, { policy, leaveTypes });
52
+ }
53
+ catch (error) {
54
+ return apiErrorResult(error, LEAVE_POLICY_HINTS);
55
+ }
56
+ });
57
+ }
58
+ export function registerGetMyLeaveBalance(server, client) {
59
+ server.registerTool('get_my_leave_balance', {
60
+ title: 'Get my leave balance',
61
+ description: 'Return the caller\'s remaining leave days for every leave type in their policy.',
62
+ inputSchema: {},
63
+ outputSchema: leaveBalanceOutputSchema,
64
+ annotations: READ_ONLY,
65
+ }, async (_args, extra) => {
66
+ try {
67
+ const context = await loadLeavePolicy(client, extra.signal);
68
+ const balances = context.balances.map(toLeaveType).map(type => ({
69
+ leaveTypeId: type.id,
70
+ leaveTypeName: type.name,
71
+ remainingDays: type.remainingDays,
72
+ isDefault: type.isDefault,
73
+ }));
74
+ const lines = balances.map(balance => `- **${balance.leaveTypeName}:** ${formatDays(balance.remainingDays)}`);
75
+ return toolResult(`## My leave balance\n\n${lines.join('\n') || 'No leave types.'}`, {
76
+ policy: toLeavePolicy(context.assignment),
77
+ balances,
78
+ });
79
+ }
80
+ catch (error) {
81
+ return apiErrorResult(error, LEAVE_POLICY_HINTS);
82
+ }
83
+ });
84
+ }
85
+ export function registerCalculateLeaveDays(server, client) {
86
+ server.registerTool('calculate_leave_days', {
87
+ title: 'Calculate leave days',
88
+ description: 'Count the working days a leave request would use (weekends, holidays and the '
89
+ + 'caller\'s shift are applied by Teamso), show the return-to-work date and run Teamso\'s '
90
+ + 'pre-check. Call it before `request_leave_otp` and confirm the numbers with the user. '
91
+ + 'Dates are Turkey local time.',
92
+ inputSchema: leaveRequestInput,
93
+ outputSchema: leaveCalculationOutputSchema,
94
+ annotations: READ_ONLY,
95
+ }, async ({ leave_type_id, start, end }, extra) => {
96
+ try {
97
+ const prepared = await prepareLeaveRequest(client, { leaveTypeId: leave_type_id, start, end }, extra.signal);
98
+ const request = draftOf(prepared);
99
+ const remainingDays = prepared.leaveType.remainingDays;
100
+ const canRequest = prepared.problems.length === 0;
101
+ const lines = [
102
+ `## ${prepared.leaveType.name}: ${formatDays(prepared.workingDays)}`,
103
+ '',
104
+ `- **Dates:** ${formatDateRange(prepared.startDate, prepared.endDate)}`,
105
+ `- **Back at work:** ${prepared.returnToWorkDate ?? '—'}`,
106
+ `- **Balance:** ${formatDays(remainingDays)} → ${formatDays(remainingDays - prepared.workingDays)} after this request`,
107
+ ];
108
+ if (!canRequest) {
109
+ lines.push('', '**Teamso would refuse this request:**', ...prepared.problems.map(problem => `- ${problem}`));
110
+ }
111
+ else {
112
+ lines.push('', 'Confirm with the user, then call `request_leave_otp` to send the SMS code.');
113
+ }
114
+ return toolResult(lines.join('\n'), {
115
+ request,
116
+ remainingDays,
117
+ remainingAfterRequest: roundDays(remainingDays - prepared.workingDays),
118
+ canRequest,
119
+ problems: prepared.problems,
120
+ ...(canRequest
121
+ ? {
122
+ nextAction: {
123
+ tool: 'request_leave_otp',
124
+ arguments: {},
125
+ reason: 'Creating the request needs an SMS code. After the user confirms these days, send '
126
+ + 'the code, then call create_leave_request with the same leave_type_id, start, end and the otp_code.',
127
+ },
128
+ }
129
+ : {}),
130
+ });
131
+ }
132
+ catch (error) {
133
+ return apiErrorResult(error, LEAVE_POLICY_HINTS);
134
+ }
135
+ });
136
+ }
137
+ export function registerRequestLeaveOtp(server, client) {
138
+ server.registerTool('request_leave_otp', {
139
+ title: 'Send a leave SMS verification code',
140
+ description: 'Send a 6-digit SMS verification code to the caller\'s phone. Teamso requires it to '
141
+ + 'create or cancel a leave request. The code is valid for 3 minutes, a new code invalidates '
142
+ + 'the previous one, and each SMS uses company digital credit, so only call it once the user '
143
+ + 'has confirmed the request. Then ask the user for the code.',
144
+ inputSchema: {},
145
+ outputSchema: otpOutputSchema,
146
+ annotations: ADDITIVE_WRITE,
147
+ }, async (_args, extra) => {
148
+ try {
149
+ await client.requestOtp(extra.signal);
150
+ const message = 'An SMS code was sent to your phone number registered in Teamso. It is valid for 3 minutes.';
151
+ return toolResult(`${message}\n\nAsk the user for the code, then call \`create_leave_request\` `
152
+ + '(or `cancel_leave_request`) with `otp_code`.', {
153
+ sent: true,
154
+ validForSeconds: OTP_VALIDITY_SECONDS,
155
+ message,
156
+ nextAction: {
157
+ tool: 'create_leave_request',
158
+ arguments: { otp_code: '<code from the SMS>' },
159
+ reason: 'Ask the user for the SMS code and pass it with the confirmed leave details '
160
+ + '(or to cancel_leave_request when cancelling) within 3 minutes.',
161
+ },
162
+ });
163
+ }
164
+ catch (error) {
165
+ return apiErrorResult(error, {
166
+ byCode: {
167
+ USER_NOT_FOUND: 'Teamso could not find a phone number for your account to send the SMS code to.',
168
+ },
169
+ });
170
+ }
171
+ });
172
+ }
173
+ export function registerCreateLeaveRequest(server, client) {
174
+ server.registerTool('create_leave_request', {
175
+ title: 'Create a leave request',
176
+ description: 'Create a leave request for the caller and send it into the approval chain. Requires '
177
+ + 'the SMS code from `request_leave_otp`. Teamso recounts the working days and runs its '
178
+ + 'pre-check before the code is used. Only call this after the user confirmed the type, '
179
+ + 'dates and day count (see `calculate_leave_days`).',
180
+ inputSchema: {
181
+ ...leaveRequestInput,
182
+ description: z.string().trim().max(1000).optional()
183
+ .describe('Reason or note for the approver. Required by some leave types (`descriptionRequired`).'),
184
+ otp_code: otpCodeSchema,
185
+ },
186
+ outputSchema: leaveCreatedOutputSchema,
187
+ annotations: ADDITIVE_WRITE,
188
+ }, async ({ leave_type_id, start, end, description, otp_code }, extra) => {
189
+ try {
190
+ const prepared = await prepareLeaveRequest(client, { leaveTypeId: leave_type_id, start, end }, extra.signal);
191
+ if (prepared.leaveType.descriptionRequired && !description) {
192
+ prepared.problems.push(explainLeaveReason('DESCRIPTION_REQUIRED'));
193
+ }
194
+ if (prepared.problems.length > 0) {
195
+ return errorResult('Teamso would refuse this leave request, so the SMS code was not used:\n\n'
196
+ + prepared.problems.map(problem => `- ${problem}`).join('\n'));
197
+ }
198
+ await client.verifyOtp(otp_code, extra.signal);
199
+ const response = await client.createLeave({
200
+ leaveType: prepared.leaveType.id,
201
+ personnelId: [prepared.me.id],
202
+ leavePolicyUserId: prepared.context.assignment.leavePolicyUserId,
203
+ startDate: prepared.startDate,
204
+ endDate: prepared.endDate,
205
+ ...(prepared.returnToWorkDate ? { returnToWorkDate: prepared.returnToWorkDate } : {}),
206
+ totalLeaveDay: prepared.workingDays,
207
+ ...(description ? { description } : {}),
208
+ documentAttached: false,
209
+ approveAndContinue: false,
210
+ }, extra.signal);
211
+ const leave = await findCreatedLeave(client, prepared, extra.signal);
212
+ const request = draftOf(prepared);
213
+ const message = createdLeaveMessage(leave);
214
+ const lines = [
215
+ `## Leave request created`,
216
+ '',
217
+ `- **Type:** ${request.leaveTypeName}`,
218
+ `- **Dates:** ${formatDateRange(request.start, request.end)} (${formatDays(request.workingDays)})`,
219
+ `- **Status:** ${leave?.status ?? response.message_code ?? 'submitted'}`,
220
+ '',
221
+ message,
222
+ ];
223
+ return toolResult(lines.join('\n'), { created: true, request, leave, message });
224
+ }
225
+ catch (error) {
226
+ return apiErrorResult(error, {
227
+ ...OTP_HINTS,
228
+ byCode: {
229
+ ...OTP_HINTS.byCode,
230
+ ITEM_EXIST: 'You already have a leave request on these dates.',
231
+ balance_cannot_go_negative: explainLeaveReason('balance_cannot_go_negative'),
232
+ leave_available_for_dates: explainLeaveReason('leave_available_for_dates'),
233
+ DESCRIPTION_REQUIRED: explainLeaveReason('DESCRIPTION_REQUIRED'),
234
+ },
235
+ forbidden: 'Requesting leave needs the `LEAVE_ADD` permission.',
236
+ });
237
+ }
238
+ });
239
+ }
240
+ export function registerListMyLeaves(server, client) {
241
+ server.registerTool('list_my_leaves', {
242
+ title: 'List my leave requests',
243
+ description: 'List the caller\'s own leave requests, newest first, with their approval status. '
244
+ + 'Optionally filter by date range and status.',
245
+ inputSchema: {
246
+ from: z.string().trim().optional().describe('Only leaves from this day on (`yyyy-MM-dd`).'),
247
+ to: z.string().trim().optional().describe('Only leaves up to this day (`yyyy-MM-dd`).'),
248
+ status: z.enum(Object.keys(LEAVE_STATUSES)).optional()
249
+ .describe('Only leaves in this status.'),
250
+ limit: z.number().int().min(1).max(100).default(20).describe('Maximum leaves to return (1-100, default 20).'),
251
+ },
252
+ outputSchema: leaveListOutputSchema,
253
+ annotations: READ_ONLY,
254
+ }, async ({ from, to, status, limit }, extra) => {
255
+ try {
256
+ const rangeStart = from ? parseWallClock(from, 'from').date : undefined;
257
+ const rangeEnd = to ? parseWallClock(to, 'to').date : undefined;
258
+ const statusCode = status ? LEAVE_STATUSES[status] : undefined;
259
+ const me = await client.getMe(extra.signal);
260
+ const { leaves, truncated } = await scanLeaves(client, {
261
+ rangeStart,
262
+ rangeEnd,
263
+ ...(statusCode !== undefined ? { searchKey: 'state', searchValue: String(statusCode) } : {}),
264
+ }, leave => leaveOwnerId(leave) === me.id && (statusCode === undefined || leave.state === statusCode), { limit }, extra.signal);
265
+ const summaries = leaves.map(toLeaveSummary);
266
+ const text = summaries.length
267
+ ? `## My leave requests\n\n${leaveTable(summaries)}`
268
+ : 'No leave requests found for these filters.';
269
+ return toolResult(text, { leaves: summaries, total: summaries.length, truncated });
270
+ }
271
+ catch (error) {
272
+ return apiErrorResult(error, {
273
+ forbidden: 'Listing leave requests needs the `LEAVE_ADD`, `LEAVE_ADD_ALL` or `LEAVE_READ_ALL` permission.',
274
+ });
275
+ }
276
+ });
277
+ }
278
+ export function registerCancelLeaveRequest(server, client) {
279
+ server.registerTool('cancel_leave_request', {
280
+ title: 'Cancel my leave request',
281
+ description: 'Cancel (delete) one of the caller\'s own leave requests. This cannot be undone. '
282
+ + 'Requires the SMS code from `request_leave_otp` and the `LEAVE_DELETE` permission. '
283
+ + 'Confirm the leave with the user first (`list_my_leaves`).',
284
+ inputSchema: {
285
+ leave_id: idSchema('Leave request id from `list_my_leaves`.'),
286
+ otp_code: otpCodeSchema,
287
+ },
288
+ outputSchema: leaveCancelledOutputSchema,
289
+ annotations: DESTRUCTIVE_WRITE,
290
+ }, async ({ leave_id, otp_code }, extra) => {
291
+ try {
292
+ const me = await client.getMe(extra.signal);
293
+ const { leaves } = await scanLeaves(client, {}, leave => leave.id === leave_id && leaveOwnerId(leave) === me.id, { limit: 1 }, extra.signal);
294
+ const target = leaves[0];
295
+ if (!target) {
296
+ return errorResult(`Leave request \`${leave_id}\` is not one of your leave requests. `
297
+ + 'Find the id with `list_my_leaves`. Use `approve_or_reject_leave` for leaves you approve.');
298
+ }
299
+ await client.verifyOtp(otp_code, extra.signal);
300
+ const response = await client.deleteLeave(leave_id, extra.signal);
301
+ const leave = toLeaveSummary(target);
302
+ const closedPayrollPeriods = closedPayrollPeriodsOf(response.result);
303
+ const message = closedPayrollPeriods.length
304
+ ? `The leave request was cancelled. It overlapped closed payroll periods (${closedPayrollPeriods.join(', ')}); `
305
+ + 'tell HR so payroll can be corrected.'
306
+ : 'The leave request was cancelled.';
307
+ return toolResult(`## Leave request cancelled\n\n- **Type:** ${leave.leaveTypeName ?? '—'}\n`
308
+ + `- **Dates:** ${formatDateRange(leave.start, leave.end)}\n\n${message}`, { cancelled: true, leave, closedPayrollPeriods, message });
309
+ }
310
+ catch (error) {
311
+ return apiErrorResult(error, {
312
+ ...OTP_HINTS,
313
+ forbidden: 'Cancelling a leave request needs the `LEAVE_DELETE` permission.',
314
+ notFound: 'Teamso could not find that leave request.',
315
+ });
316
+ }
317
+ });
318
+ }
319
+ function draftOf(prepared) {
320
+ return {
321
+ leaveTypeId: prepared.leaveType.id,
322
+ leaveTypeName: prepared.leaveType.name,
323
+ start: prepared.startDate,
324
+ end: prepared.endDate,
325
+ workingDays: roundDays(prepared.workingDays),
326
+ ...(prepared.returnToWorkDate ? { returnToWorkDate: prepared.returnToWorkDate } : {}),
327
+ };
328
+ }
329
+ /** `POST /leave` returns no id, so the new leave is looked up in the caller's list. */
330
+ async function findCreatedLeave(client, prepared, signal) {
331
+ try {
332
+ const { leaves } = await scanLeaves(client, {}, (leave) => leaveOwnerId(leave) === prepared.me.id
333
+ && leaveTypeIdOf(leave) === prepared.leaveType.id
334
+ && leave.startDate === prepared.startDate, { limit: 1, pageSize: 50, maxPages: 1 }, signal);
335
+ return leaves[0] ? toLeaveSummary(leaves[0]) : null;
336
+ }
337
+ catch {
338
+ return null;
339
+ }
340
+ }
341
+ function leaveTypeRules(type) {
342
+ const rules = [];
343
+ if (type.minDaysPerRequest)
344
+ rules.push(`min ${type.minDaysPerRequest} days/request`);
345
+ if (type.maxDaysPerRequest)
346
+ rules.push(`max ${type.maxDaysPerRequest} days/request`);
347
+ if (type.countsCalendarDays)
348
+ rules.push('calendar days');
349
+ if (type.documentRequired)
350
+ rules.push('document required (web/mobile only)');
351
+ if (type.descriptionRequired)
352
+ rules.push('description required');
353
+ if (type.birthdayLeave)
354
+ rules.push('birthday leave');
355
+ if (!type.paid)
356
+ rules.push('unpaid');
357
+ return rules;
358
+ }
359
+ function leaveTable(leaves) {
360
+ return markdownTable(['Id', 'Type', 'Dates', 'Days', 'Status'], leaves.map(leave => [
361
+ `\`${leave.id}\``,
362
+ leave.leaveTypeName,
363
+ formatDateRange(leave.start, leave.end),
364
+ leave.workingDays,
365
+ escapeCell(leave.status),
366
+ ]));
367
+ }
368
+ /** What happened to a new leave, from its status: approval chains can approve it on the spot. */
369
+ export function createdLeaveMessage(leave) {
370
+ if (!leave) {
371
+ return 'Teamso accepted the leave request, but it is not visible in your leave list yet. '
372
+ + 'Check it later with `list_my_leaves`.';
373
+ }
374
+ switch (leave.status) {
375
+ case 'approved':
376
+ case 'completed':
377
+ return 'The leave request was created and approved right away (no approval step applies to it).';
378
+ case 'awaiting_document':
379
+ return 'The leave request was created and waits for its document; upload it in Teamso to start the approval.';
380
+ case 'rejected':
381
+ return 'The leave request was created but rejected by an automatic rule; see the request in Teamso.';
382
+ default:
383
+ return 'The leave request was created and sent for approval.';
384
+ }
385
+ }
386
+ //# sourceMappingURL=leave.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leave.js","sourceRoot":"","sources":["../../src/tools/leave.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { TeamsoClient } from '../client.js';
3
+ export declare function registerListMyPayslips(server: McpServer, client: TeamsoClient): void;
4
+ export declare function registerGetPayslipPdf(server: McpServer, client: TeamsoClient): void;
5
+ //# sourceMappingURL=payroll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payroll.d.ts","sourceRoot":"","sources":["../../src/tools/payroll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAOjD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAgDpF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAqDnF"}
@@ -0,0 +1,101 @@
1
+ import { z } from 'zod';
2
+ import { markdownTable } from '../utils/format.js';
3
+ import { apiErrorResult, errorResult, toolResult } from '../utils/results.js';
4
+ import { toPayslip } from '../utils/structured.js';
5
+ import { payslipListOutputSchema, payslipPdfOutputSchema } from './schemas.js';
6
+ import { READ_ONLY, idSchema } from './shared.js';
7
+ export function registerListMyPayslips(server, client) {
8
+ server.registerTool('list_my_payslips', {
9
+ title: 'List my payslips',
10
+ description: 'List the caller\'s own e-payslips (newest term first) with their status and any '
11
+ + 'objection answers. Open one with `get_payslip_pdf`.',
12
+ inputSchema: {
13
+ term: z.string().trim().regex(/^\d{4}(-\d{2})?$/, 'term must be `yyyy` or `yyyy-MM`').optional()
14
+ .describe('Only this payroll term: a month `yyyy-MM` or a whole year `yyyy`.'),
15
+ limit: z.number().int().min(1).max(50).default(12).describe('Maximum payslips (1-50, default 12).'),
16
+ },
17
+ outputSchema: payslipListOutputSchema,
18
+ annotations: READ_ONLY,
19
+ }, async ({ term, limit }, extra) => {
20
+ try {
21
+ const page = await client.listMyPayslips({
22
+ size: limit,
23
+ ...(term ? { searchKey: 'term', searchValue: term } : {}),
24
+ }, extra.signal);
25
+ const payslips = (page?.content ?? []).map(toPayslip);
26
+ const total = page?.pagination?.totalElements ?? payslips.length;
27
+ if (payslips.length === 0) {
28
+ return toolResult(term ? `No payslips for ${term}.` : 'You have no payslips yet.', { payslips, total: 0 });
29
+ }
30
+ const table = markdownTable(['Term', 'Id', 'Status', 'Sent'], payslips.map(payslip => [payslip.term, `\`${payslip.id}\``, payslip.status, payslip.sentToEmployeeAt]));
31
+ return toolResult(`## My payslips\n\n${table}`, {
32
+ payslips,
33
+ total,
34
+ nextAction: {
35
+ tool: 'get_payslip_pdf',
36
+ arguments: { payslip_id: payslips[0].id },
37
+ reason: 'Open the payslip PDF when the user asks for its details.',
38
+ },
39
+ });
40
+ }
41
+ catch (error) {
42
+ return apiErrorResult(error, {
43
+ byCode: {
44
+ INVALID_INPUT_PARAMETERS: 'Teamso rejected the payslip filter. Use `term` as `yyyy-MM` or `yyyy`.',
45
+ },
46
+ });
47
+ }
48
+ });
49
+ }
50
+ export function registerGetPayslipPdf(server, client) {
51
+ server.registerTool('get_payslip_pdf', {
52
+ title: 'Get a payslip PDF',
53
+ description: 'Download one of the caller\'s payslips as a PDF, returned as an embedded '
54
+ + '`application/pdf` resource. Payslips contain salary data: show them only to their owner.',
55
+ inputSchema: {
56
+ payslip_id: idSchema('Payslip id from `list_my_payslips`.'),
57
+ },
58
+ outputSchema: payslipPdfOutputSchema,
59
+ annotations: READ_ONLY,
60
+ }, async ({ payslip_id }, extra) => {
61
+ try {
62
+ const file = await client.downloadPayslip(payslip_id, extra.signal);
63
+ if (file.data.byteLength === 0) {
64
+ return errorResult('Teamso returned an empty payslip file. Try again, or open it in the Teamso app.');
65
+ }
66
+ const fileName = file.fileName ?? `payslip-${payslip_id}.pdf`;
67
+ const resourceUri = `teamso://payslips/${encodeURIComponent(payslip_id)}.pdf`;
68
+ const sizeBytes = file.data.byteLength;
69
+ return {
70
+ content: [
71
+ {
72
+ type: 'text',
73
+ text: `Payslip PDF \`${fileName}\` (${Math.ceil(sizeBytes / 1024)} KB) is attached.`,
74
+ },
75
+ {
76
+ type: 'resource',
77
+ resource: {
78
+ uri: resourceUri,
79
+ mimeType: file.contentType || 'application/pdf',
80
+ blob: Buffer.from(file.data).toString('base64'),
81
+ },
82
+ },
83
+ ],
84
+ structuredContent: {
85
+ payslipId: payslip_id,
86
+ fileName,
87
+ mimeType: file.contentType || 'application/pdf',
88
+ sizeBytes,
89
+ resourceUri,
90
+ },
91
+ };
92
+ }
93
+ catch (error) {
94
+ return apiErrorResult(error, {
95
+ notFound: 'Teamso has no payslip PDF with that id for you (it may not be sent to you yet). '
96
+ + 'Find the id with `list_my_payslips`.',
97
+ });
98
+ }
99
+ });
100
+ }
101
+ //# sourceMappingURL=payroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payroll.js","sourceRoot":"","sources":["../../src/tools/payroll.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAoB;IAC5E,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,kFAAkF;cAC3F,qDAAqD;QACzD,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,kCAAkC,CAAC,CAAC,QAAQ,EAAE;iBAC7F,QAAQ,CAAC,mEAAmE,CAAC;YAChF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;SACpG;QACD,YAAY,EAAE,uBAAuB;QACrC,WAAW,EAAE,SAAS;KACvB,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC;gBACvC,IAAI,EAAE,KAAK;gBACX,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAe,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACjB,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,IAAI,EAAE,UAAU,EAAE,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC;YACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,IAAI,GAAG,CAAC,CAAC,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7G,CAAC;YACD,MAAM,KAAK,GAAG,aAAa,CACzB,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAChC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,CACvG,CAAC;YACF,OAAO,UAAU,CAAC,qBAAqB,KAAK,EAAE,EAAE;gBAC9C,QAAQ;gBACR,KAAK;gBACL,UAAU,EAAE;oBACV,IAAI,EAAE,iBAAiB;oBACvB,SAAS,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAE,CAAC,EAAE,EAAE;oBAC1C,MAAM,EAAE,0DAA0D;iBACnE;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,cAAc,CAAC,KAAK,EAAE;gBAC3B,MAAM,EAAE;oBACN,wBAAwB,EAAE,wEAAwE;iBACnG;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAoB;IAC3E,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,2EAA2E;cACpF,0FAA0F;QAC9F,WAAW,EAAE;YACX,UAAU,EAAE,QAAQ,CAAC,qCAAqC,CAAC;SAC5D;QACD,YAAY,EAAE,sBAAsB;QACpC,WAAW,EAAE,SAAS;KACvB,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACpE,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,WAAW,CAAC,iFAAiF,CAAC,CAAC;YACxG,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,UAAU,MAAM,CAAC;YAC9D,MAAM,WAAW,GAAG,qBAAqB,kBAAkB,CAAC,UAAU,CAAC,MAAM,CAAC;YAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;YACvC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,iBAAiB,QAAQ,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,mBAAmB;qBACrF;oBACD;wBACE,IAAI,EAAE,UAAmB;wBACzB,QAAQ,EAAE;4BACR,GAAG,EAAE,WAAW;4BAChB,QAAQ,EAAE,IAAI,CAAC,WAAW,IAAI,iBAAiB;4BAC/C,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;yBAChD;qBACF;iBACF;gBACD,iBAAiB,EAAE;oBACjB,SAAS,EAAE,UAAU;oBACrB,QAAQ;oBACR,QAAQ,EAAE,IAAI,CAAC,WAAW,IAAI,iBAAiB;oBAC/C,SAAS;oBACT,WAAW;iBACZ;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,cAAc,CAAC,KAAK,EAAE;gBAC3B,QAAQ,EAAE,kFAAkF;sBACxF,sCAAsC;aAC3C,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { type TeamsoClient } from '../client.js';
3
+ export declare function registerListPerformancePeriods(server: McpServer, client: TeamsoClient): void;
4
+ export declare function registerListMyGoals(server: McpServer, client: TeamsoClient): void;
5
+ export declare function registerListTeamGoals(server: McpServer, client: TeamsoClient): void;
6
+ export declare function registerCreateUserGoal(server: McpServer, client: TeamsoClient): void;
7
+ export declare function registerSendGoalsToApproval(server: McpServer, client: TeamsoClient): void;
8
+ export declare function registerApproveGoal(server: McpServer, client: TeamsoClient): void;
9
+ export declare function registerReviseAndApproveGoal(server: McpServer, client: TeamsoClient): void;
10
+ export declare function registerUpdateGoalActualValue(server: McpServer, client: TeamsoClient): void;
11
+ export declare function registerUpdateManagerActualValue(server: McpServer, client: TeamsoClient): void;
12
+ export declare function registerApproveGoalEvaluation(server: McpServer, client: TeamsoClient): void;
13
+ //# sourceMappingURL=performance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../src/tools/performance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAqEjE,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAoC5F;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA6CjF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAkDnF;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA6FpF;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA4BzF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAsBjF;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAuC1F;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAiC3F;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAiC9F;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAyC3F"}