@selfagency/teamdynamix-mcp 0.1.0 → 0.1.1
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.
- package/README.md +7 -2
- package/index.js +109 -57
- package/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 🎟️ TeamDynamix MCP Server (unofficial)
|
|
2
|
+
|
|
3
|
+
 [](https://github.com/selfagency/teamdynamix-mcp/actions/workflows/ci.yml) [](https://codecov.io/gh/selfagency/teamdynamix-mcp)
|
|
2
4
|
|
|
3
5
|
A TypeScript [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) server that exposes [TeamDynamix](https://www.teamdynamix.com/) ITSM capabilities as agent-callable tools. Designed for AI agents and MCP clients that need structured, safety-gated access to TeamDynamix operations.
|
|
4
6
|
|
|
@@ -51,6 +53,9 @@ For admin mode, use `TEAMDYNAMIX_BEID` and `TEAMDYNAMIX_WEB_SERVICES_KEY` instea
|
|
|
51
53
|
|
|
52
54
|
## MCP client configuration
|
|
53
55
|
|
|
56
|
+
> **Security notice:** Values shown above are placeholders. **Never commit real credentials to source control.**
|
|
57
|
+
> Inject secrets at runtime via a `.env` file (excluded by `.gitignore`), CI/CD secrets, or a secret manager.
|
|
58
|
+
|
|
54
59
|
### VS Code (`.vscode/mcp.json`)
|
|
55
60
|
|
|
56
61
|
```json
|
|
@@ -184,4 +189,4 @@ pnpm build # tsup → dist/
|
|
|
184
189
|
|
|
185
190
|
## License
|
|
186
191
|
|
|
187
|
-
MIT © [
|
|
192
|
+
MIT © [The Self Agency LLC](https://self.agency)
|
package/index.js
CHANGED
|
@@ -20,7 +20,10 @@ var TEAMDYNAMIX_MAX_RATE_LIMIT_WAIT_MS = 3e4;
|
|
|
20
20
|
// src/config.ts
|
|
21
21
|
var SERVER_NAME_OVERRIDE = process.env["MCP_SERVER_NAME"]?.trim() || void 0;
|
|
22
22
|
var SERVER_VERSION_OVERRIDE = process.env["MCP_SERVER_VERSION"]?.trim() || void 0;
|
|
23
|
-
var
|
|
23
|
+
var validLogLevels = ["debug", "info", "warn", "error"];
|
|
24
|
+
var logLevelSchema = z.enum(validLogLevels);
|
|
25
|
+
var parsedLogLevel = logLevelSchema.safeParse(process.env["MCP_LOG_LEVEL"]?.trim());
|
|
26
|
+
var LOG_LEVEL = parsedLogLevel.success ? parsedLogLevel.data : "info";
|
|
24
27
|
function normalizeOptionalString(value) {
|
|
25
28
|
const normalized = value?.trim();
|
|
26
29
|
return normalized ? normalized : void 0;
|
|
@@ -199,10 +202,14 @@ var TextTransformModeSchema = z2.enum(["uppercase", "lowercase", "trim", "slug"]
|
|
|
199
202
|
|
|
200
203
|
// src/schemas/teamdynamix/index.ts
|
|
201
204
|
var TeamDynamixAppIdSchema = z3.number().int().positive().describe("TeamDynamix application ID.");
|
|
205
|
+
var IsoDateSchema = z3.string().regex(
|
|
206
|
+
/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:?\d{2})?)?$/,
|
|
207
|
+
"Must be a valid ISO 8601 date string."
|
|
208
|
+
);
|
|
202
209
|
var TeamDynamixGuidSchema = z3.string().uuid().describe("TeamDynamix GUID identifier.");
|
|
203
210
|
var TeamDynamixResponseFormatSchema = ResponseFormatSchema;
|
|
204
211
|
var TicketSearchSchema = z3.object({
|
|
205
|
-
Keywords: z3.string().optional().describe("Full-text search term."),
|
|
212
|
+
Keywords: z3.string().max(500).optional().describe("Full-text search term."),
|
|
206
213
|
MaxResults: z3.number().int().min(1).max(1e3).optional().default(50).describe("Maximum results to return (1\u20131000)."),
|
|
207
214
|
StatusIDs: z3.array(z3.number().int()).optional().describe("Filter by ticket status IDs."),
|
|
208
215
|
TypeIDs: z3.array(z3.number().int()).optional().describe("Filter by ticket type IDs."),
|
|
@@ -213,25 +220,25 @@ var TicketSearchSchema = z3.object({
|
|
|
213
220
|
ResponsibleGroupIDs: z3.array(z3.number().int()).optional().describe("Filter by responsible group IDs."),
|
|
214
221
|
ResponsibleUids: z3.array(z3.string().uuid()).optional().describe("Filter by responsible user GUIDs."),
|
|
215
222
|
RequestorUids: z3.array(z3.string().uuid()).optional().describe("Filter by requestor user GUIDs."),
|
|
216
|
-
CreatedDateFrom:
|
|
217
|
-
CreatedDateTo:
|
|
218
|
-
ModifiedDateFrom:
|
|
219
|
-
ModifiedDateTo:
|
|
220
|
-
ClosedDateFrom:
|
|
221
|
-
ClosedDateTo:
|
|
222
|
-
SortBy: z3.string().optional().describe("Field name to sort results by."),
|
|
223
|
+
CreatedDateFrom: IsoDateSchema.optional().describe("ISO 8601 start date for creation date filter."),
|
|
224
|
+
CreatedDateTo: IsoDateSchema.optional().describe("ISO 8601 end date for creation date filter."),
|
|
225
|
+
ModifiedDateFrom: IsoDateSchema.optional().describe("ISO 8601 start date for last-modified filter."),
|
|
226
|
+
ModifiedDateTo: IsoDateSchema.optional().describe("ISO 8601 end date for last-modified filter."),
|
|
227
|
+
ClosedDateFrom: IsoDateSchema.optional().describe("ISO 8601 start date for closed date filter."),
|
|
228
|
+
ClosedDateTo: IsoDateSchema.optional().describe("ISO 8601 end date for closed date filter."),
|
|
229
|
+
SortBy: z3.string().max(100).optional().describe("Field name to sort results by."),
|
|
223
230
|
SortOrder: z3.enum(["A", "D"]).optional().describe("Sort order: A = ascending, D = descending.")
|
|
224
231
|
});
|
|
225
232
|
var TicketCreateSchema = z3.object({
|
|
226
233
|
TypeID: z3.number().int().positive().describe("Ticket type ID."),
|
|
227
|
-
Title: z3.string().min(1).describe("Ticket title/subject."),
|
|
234
|
+
Title: z3.string().min(1).max(500).describe("Ticket title/subject."),
|
|
228
235
|
AccountID: z3.number().int().positive().optional().describe("Account/department ID."),
|
|
229
236
|
StatusID: z3.number().int().nonnegative().optional().describe("Initial ticket status ID."),
|
|
230
237
|
PriorityID: z3.number().int().nonnegative().optional().describe("Ticket priority ID."),
|
|
231
238
|
UrgencyID: z3.number().int().nonnegative().optional().describe("Ticket urgency ID."),
|
|
232
239
|
ImpactID: z3.number().int().nonnegative().optional().describe("Ticket impact ID."),
|
|
233
240
|
SourceID: z3.number().int().nonnegative().optional().describe("Ticket source ID."),
|
|
234
|
-
Description: z3.string().optional().describe("Full description/body of the ticket (HTML supported)."),
|
|
241
|
+
Description: z3.string().max(65535).optional().describe("Full description/body of the ticket (HTML supported)."),
|
|
235
242
|
RequestorUID: z3.string().uuid().optional().describe("GUID of the requestor."),
|
|
236
243
|
ResponsibleUID: z3.string().uuid().optional().describe("GUID of the responsible technician."),
|
|
237
244
|
ResponsibleGroupID: z3.number().int().positive().optional().describe("Responsible group ID."),
|
|
@@ -245,56 +252,56 @@ var TicketCreateSchema = z3.object({
|
|
|
245
252
|
});
|
|
246
253
|
var TicketPatchSchema = z3.object({
|
|
247
254
|
TicketID: z3.number().int().positive().describe("Ticket ID to update."),
|
|
248
|
-
Attributes: z3.record(z3.string(), z3.string()).describe(
|
|
249
|
-
'Fields to update as key/value pairs. Keys must be valid ticket field names (e.g. "StatusID", "Title", "ResponsibleUID").'
|
|
255
|
+
Attributes: z3.record(z3.string().max(100), z3.string().max(65535)).refine((obj) => Object.keys(obj).length <= 50, { message: "Attributes may contain at most 50 fields per update." }).describe(
|
|
256
|
+
'Fields to update as key/value pairs. Keys must be valid ticket field names (e.g. "StatusID", "Title", "ResponsibleUID"). Maximum 50 fields per update.'
|
|
250
257
|
),
|
|
251
258
|
NotifyRequestor: z3.boolean().optional().default(false).describe("Notify the requestor of the change."),
|
|
252
259
|
NotifyResponsible: z3.boolean().optional().default(false).describe("Notify the responsible technician of the change."),
|
|
253
|
-
Comments: z3.string().optional().describe("Comment to attach to this update."),
|
|
260
|
+
Comments: z3.string().max(65535).optional().describe("Comment to attach to this update."),
|
|
254
261
|
IsPrivate: z3.boolean().optional().default(false).describe("Whether the comment is private.")
|
|
255
262
|
});
|
|
256
263
|
var TicketCommentSchema = z3.object({
|
|
257
264
|
TicketID: z3.number().int().positive().describe("Ticket ID to comment on."),
|
|
258
|
-
Body: z3.string().min(1).describe("Comment body (HTML supported)."),
|
|
265
|
+
Body: z3.string().min(1).max(65535).describe("Comment body (HTML supported)."),
|
|
259
266
|
IsPrivate: z3.boolean().optional().default(false).describe("Whether this comment is private."),
|
|
260
267
|
NotifyRequestor: z3.boolean().optional().default(false).describe("Notify the requestor."),
|
|
261
268
|
NotifyResponsible: z3.boolean().optional().default(false).describe("Notify the responsible technician.")
|
|
262
269
|
});
|
|
263
270
|
var UserSearchSchema = z3.object({
|
|
264
|
-
SearchText: z3.string().optional().describe("Name, username, or email to search for."),
|
|
271
|
+
SearchText: z3.string().max(500).optional().describe("Name, username, or email to search for."),
|
|
265
272
|
IsActive: z3.boolean().optional().describe("Filter by active (true) or inactive (false) users."),
|
|
266
273
|
IsEmployee: z3.boolean().optional().describe("Filter to employees only."),
|
|
267
274
|
AppID: z3.number().int().positive().optional().describe("Scope search to a specific application."),
|
|
268
275
|
MaxResults: z3.number().int().min(1).max(1e3).optional().default(25).describe("Maximum results (1\u20131000).")
|
|
269
276
|
});
|
|
270
277
|
var GroupSearchSchema = z3.object({
|
|
271
|
-
NameLike: z3.string().optional().describe("Partial group name to search."),
|
|
278
|
+
NameLike: z3.string().max(500).optional().describe("Partial group name to search."),
|
|
272
279
|
IsActive: z3.boolean().optional().describe("Filter by active (true) or inactive (false) groups."),
|
|
273
280
|
AppID: z3.number().int().positive().optional().describe("Scope search to a specific application.")
|
|
274
281
|
});
|
|
275
282
|
var KbArticleSearchSchema = z3.object({
|
|
276
|
-
SearchText: z3.string().optional().describe("Full-text search within articles."),
|
|
283
|
+
SearchText: z3.string().max(500).optional().describe("Full-text search within articles."),
|
|
277
284
|
CategoryID: z3.number().int().positive().optional().describe("Filter by KB category ID."),
|
|
278
285
|
IsPublished: z3.boolean().optional().describe("Filter to published articles only."),
|
|
279
286
|
MaxResults: z3.number().int().min(1).max(500).optional().default(25).describe("Maximum results (1\u2013500).")
|
|
280
287
|
});
|
|
281
288
|
var AssetSearchSchema = z3.object({
|
|
282
|
-
SerialLike: z3.string().optional().describe("Partial serial number to match."),
|
|
283
|
-
TagLike: z3.string().optional().describe("Partial asset tag to match."),
|
|
284
|
-
SearchText: z3.string().optional().describe("General text search across asset fields."),
|
|
289
|
+
SerialLike: z3.string().max(200).optional().describe("Partial serial number to match."),
|
|
290
|
+
TagLike: z3.string().max(200).optional().describe("Partial asset tag to match."),
|
|
291
|
+
SearchText: z3.string().max(500).optional().describe("General text search across asset fields."),
|
|
285
292
|
StatusIDs: z3.array(z3.number().int()).optional().describe("Filter by asset status IDs."),
|
|
286
293
|
OwnerUID: z3.string().uuid().optional().describe("Filter by asset owner GUID."),
|
|
287
294
|
UsingDepartmentID: z3.number().int().positive().optional().describe("Filter by using department ID."),
|
|
288
295
|
MaxResults: z3.number().int().min(1).max(1e3).optional().default(25).describe("Maximum results (1\u20131000).")
|
|
289
296
|
});
|
|
290
297
|
var ServiceSearchSchema = z3.object({
|
|
291
|
-
SearchText: z3.string().optional().describe("Full-text search across service fields."),
|
|
298
|
+
SearchText: z3.string().max(500).optional().describe("Full-text search across service fields."),
|
|
292
299
|
IsActive: z3.boolean().optional().describe("Filter to active services only."),
|
|
293
300
|
CategoryID: z3.number().int().positive().optional().describe("Filter by service category ID."),
|
|
294
301
|
MaxResults: z3.number().int().min(1).max(500).optional().default(25).describe("Maximum results (1\u2013500).")
|
|
295
302
|
});
|
|
296
303
|
var ProjectSearchSchema = z3.object({
|
|
297
|
-
NameLike: z3.string().optional().describe("Partial project name to search."),
|
|
304
|
+
NameLike: z3.string().max(500).optional().describe("Partial project name to search."),
|
|
298
305
|
TypeIDs: z3.array(z3.number().int()).optional().describe("Filter by project type IDs."),
|
|
299
306
|
IsActive: z3.boolean().optional().describe("Filter to active projects."),
|
|
300
307
|
ManagerUID: z3.string().uuid().optional().describe("Filter by project manager GUID."),
|
|
@@ -302,28 +309,28 @@ var ProjectSearchSchema = z3.object({
|
|
|
302
309
|
});
|
|
303
310
|
var TicketTaskCreateSchema = z3.object({
|
|
304
311
|
TicketID: z3.number().int().positive().describe("Parent ticket ID."),
|
|
305
|
-
Title: z3.string().min(1).describe("Task title."),
|
|
306
|
-
Description: z3.string().optional().describe("Task description."),
|
|
312
|
+
Title: z3.string().min(1).max(500).describe("Task title."),
|
|
313
|
+
Description: z3.string().max(65535).optional().describe("Task description."),
|
|
307
314
|
IsActive: z3.boolean().optional().default(true).describe("Whether the task is active."),
|
|
308
315
|
AssignedUID: z3.string().uuid().optional().describe("GUID of the assigned user."),
|
|
309
316
|
AssignedGroupID: z3.number().int().positive().optional().describe("Assigned group ID."),
|
|
310
317
|
EstimatedMinutes: z3.number().int().nonnegative().optional().describe("Estimated minutes to complete."),
|
|
311
|
-
StartDate:
|
|
312
|
-
EndDate:
|
|
318
|
+
StartDate: IsoDateSchema.optional().describe("Task start date (ISO 8601)."),
|
|
319
|
+
EndDate: IsoDateSchema.optional().describe("Task due date (ISO 8601).")
|
|
313
320
|
});
|
|
314
321
|
var KbArticleCreateSchema = z3.object({
|
|
315
|
-
Subject: z3.string().min(1).describe("Article title/subject."),
|
|
316
|
-
Body: z3.string().min(1).describe("Article body content (HTML supported)."),
|
|
317
|
-
Summary: z3.string().optional().describe("Short article summary."),
|
|
322
|
+
Subject: z3.string().min(1).max(500).describe("Article title/subject."),
|
|
323
|
+
Body: z3.string().min(1).max(5e5).describe("Article body content (HTML supported)."),
|
|
324
|
+
Summary: z3.string().max(2e3).optional().describe("Short article summary."),
|
|
318
325
|
CategoryID: z3.number().int().positive().optional().describe("KB category ID."),
|
|
319
326
|
IsPublished: z3.boolean().optional().default(false).describe("Whether to publish the article immediately."),
|
|
320
|
-
Tags: z3.string().optional().describe("Comma-separated tags for the article.")
|
|
327
|
+
Tags: z3.string().max(1e3).optional().describe("Comma-separated tags for the article.")
|
|
321
328
|
});
|
|
322
329
|
var KbArticleUpdateSchema = KbArticleCreateSchema.partial().extend({
|
|
323
330
|
ArticleID: z3.number().int().positive().describe("KB article ID to update.")
|
|
324
331
|
});
|
|
325
332
|
var CiSearchSchema = z3.object({
|
|
326
|
-
SearchText: z3.string().optional().describe("Full-text search across CI fields."),
|
|
333
|
+
SearchText: z3.string().max(500).optional().describe("Full-text search across CI fields."),
|
|
327
334
|
TypeIDs: z3.array(z3.number().int()).optional().describe("Filter by CI type IDs."),
|
|
328
335
|
OwnerUID: z3.string().uuid().optional().describe("Filter by owner GUID."),
|
|
329
336
|
MaxResults: z3.number().int().min(1).max(1e3).optional().default(25).describe("Maximum results (1\u20131000).")
|
|
@@ -332,25 +339,25 @@ var CustomAttributeComponentIdSchema = z3.number().int().positive().describe(
|
|
|
332
339
|
"TeamDynamix component ID for the attribute context. Common values: 9 = Ticket, 27 = Asset, 63 = KB Article, 31 = Person."
|
|
333
340
|
);
|
|
334
341
|
var ProjectIssueCreateSchema = z3.object({
|
|
335
|
-
Title: z3.string().min(1).describe("Issue title."),
|
|
336
|
-
Description: z3.string().optional().describe("Issue description."),
|
|
342
|
+
Title: z3.string().min(1).max(500).describe("Issue title."),
|
|
343
|
+
Description: z3.string().max(65535).optional().describe("Issue description."),
|
|
337
344
|
AssignedUID: z3.string().uuid().optional().describe("GUID of the assigned user."),
|
|
338
345
|
StatusID: z3.number().int().nonnegative().optional().describe("Issue status ID."),
|
|
339
346
|
PriorityID: z3.number().int().nonnegative().optional().describe("Issue priority ID."),
|
|
340
|
-
DueDate:
|
|
347
|
+
DueDate: IsoDateSchema.optional().describe("Issue due date (ISO 8601).")
|
|
341
348
|
});
|
|
342
349
|
var ProjectRiskCreateSchema = z3.object({
|
|
343
|
-
Title: z3.string().min(1).describe("Risk title."),
|
|
344
|
-
Description: z3.string().optional().describe("Risk description."),
|
|
350
|
+
Title: z3.string().min(1).max(500).describe("Risk title."),
|
|
351
|
+
Description: z3.string().max(65535).optional().describe("Risk description."),
|
|
345
352
|
AssignedUID: z3.string().uuid().optional().describe("GUID of the risk owner."),
|
|
346
353
|
StatusID: z3.number().int().nonnegative().optional().describe("Risk status ID."),
|
|
347
354
|
Probability: z3.number().int().min(1).max(100).optional().describe("Probability percentage (1\u2013100)."),
|
|
348
355
|
Impact: z3.number().int().min(1).max(5).optional().describe("Impact level (1 = low, 5 = critical)."),
|
|
349
|
-
DueDate:
|
|
356
|
+
DueDate: IsoDateSchema.optional().describe("Risk resolution due date (ISO 8601).")
|
|
350
357
|
});
|
|
351
358
|
var TimeEntryQuerySchema = z3.object({
|
|
352
|
-
StartDate:
|
|
353
|
-
EndDate:
|
|
359
|
+
StartDate: IsoDateSchema.describe("Start date for time entries query (ISO 8601 date, e.g. 2026-01-01)."),
|
|
360
|
+
EndDate: IsoDateSchema.describe("End date for time entries query (ISO 8601 date, e.g. 2026-01-31).")
|
|
354
361
|
});
|
|
355
362
|
var TeamDynamixEntitySchema = z3.record(z3.string(), z3.unknown()).describe("Base TeamDynamix entity with flexible additional fields");
|
|
356
363
|
var TeamDynamixNamedEntitySchema = z3.object({
|
|
@@ -406,9 +413,37 @@ function sleep(ms) {
|
|
|
406
413
|
function normalizePath(path) {
|
|
407
414
|
return path.startsWith("/") ? path : `/${path}`;
|
|
408
415
|
}
|
|
416
|
+
var TokenBucket = class {
|
|
417
|
+
constructor(capacity, refillRatePerMs) {
|
|
418
|
+
this.capacity = capacity;
|
|
419
|
+
this.refillRatePerMs = refillRatePerMs;
|
|
420
|
+
this.tokens = capacity;
|
|
421
|
+
this.lastRefillMs = Date.now();
|
|
422
|
+
}
|
|
423
|
+
tokens;
|
|
424
|
+
lastRefillMs;
|
|
425
|
+
refill() {
|
|
426
|
+
const now = Date.now();
|
|
427
|
+
const elapsed = now - this.lastRefillMs;
|
|
428
|
+
this.tokens = Math.min(this.capacity, this.tokens + elapsed * this.refillRatePerMs);
|
|
429
|
+
this.lastRefillMs = now;
|
|
430
|
+
}
|
|
431
|
+
async acquire() {
|
|
432
|
+
this.refill();
|
|
433
|
+
if (this.tokens >= 1) {
|
|
434
|
+
this.tokens -= 1;
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
const waitMs = Math.ceil((1 - this.tokens) / this.refillRatePerMs);
|
|
438
|
+
await sleep(waitMs);
|
|
439
|
+
return this.acquire();
|
|
440
|
+
}
|
|
441
|
+
};
|
|
442
|
+
var sharedRateLimiter = new TokenBucket(20, 2 / 1e3);
|
|
409
443
|
var TeamDynamixClient = class {
|
|
410
|
-
constructor(config) {
|
|
444
|
+
constructor(config, rateLimiter = sharedRateLimiter) {
|
|
411
445
|
this.config = config;
|
|
446
|
+
this.rateLimiter = rateLimiter;
|
|
412
447
|
}
|
|
413
448
|
cachedToken = null;
|
|
414
449
|
async getCurrentUser() {
|
|
@@ -467,13 +502,14 @@ var TeamDynamixClient = class {
|
|
|
467
502
|
});
|
|
468
503
|
}
|
|
469
504
|
async createTicket(appId, body, notifyRequestor = false, notifyResponsible = false) {
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
505
|
+
const qs = new URLSearchParams({
|
|
506
|
+
NotifyRequestor: String(notifyRequestor),
|
|
507
|
+
NotifyResponsible: String(notifyResponsible)
|
|
508
|
+
});
|
|
509
|
+
return await this.requestJson(`/api/${appId}/tickets?${qs}`, {
|
|
510
|
+
method: "POST",
|
|
511
|
+
body: JSON.stringify(body)
|
|
512
|
+
});
|
|
477
513
|
}
|
|
478
514
|
async updateTicket(appId, ticketId, body, notifyRequestor = false, notifyResponsible = false, comments = "", isPrivate = false) {
|
|
479
515
|
const qs = new URLSearchParams({
|
|
@@ -698,8 +734,16 @@ var TeamDynamixClient = class {
|
|
|
698
734
|
};
|
|
699
735
|
const endpoint = `${this.config.baseUrl}${normalizePath(path)}`;
|
|
700
736
|
const cappedRetries = Math.min(this.config.maxRetries, TEAMDYNAMIX_MAX_RETRY_ATTEMPTS);
|
|
737
|
+
await this.rateLimiter.acquire();
|
|
701
738
|
for (let attempt = 0; attempt <= cappedRetries; attempt += 1) {
|
|
702
|
-
const
|
|
739
|
+
const controller = new AbortController();
|
|
740
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.timeoutMs);
|
|
741
|
+
let response;
|
|
742
|
+
try {
|
|
743
|
+
response = await fetch(endpoint, { ...requestInit, signal: controller.signal });
|
|
744
|
+
} finally {
|
|
745
|
+
clearTimeout(timeoutId);
|
|
746
|
+
}
|
|
703
747
|
if (response.status === 429 && attempt < cappedRetries) {
|
|
704
748
|
const rateLimit = parseRateLimit(response.headers);
|
|
705
749
|
if (LOG_LEVEL === "debug") {
|
|
@@ -755,14 +799,22 @@ var TeamDynamixClient = class {
|
|
|
755
799
|
const isAdmin = this.config.authMode === "admin";
|
|
756
800
|
const loginPath = isAdmin ? "/api/auth/loginadmin" : "/api/auth/login";
|
|
757
801
|
const body = isAdmin ? JSON.stringify({ BEID: this.config.beid, WebServicesKey: this.config.webServicesKey }) : JSON.stringify({ username: this.config.username, password: this.config.password });
|
|
758
|
-
const
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
802
|
+
const loginController = new AbortController();
|
|
803
|
+
const loginTimeoutId = setTimeout(() => loginController.abort(), this.config.timeoutMs);
|
|
804
|
+
let response;
|
|
805
|
+
try {
|
|
806
|
+
response = await fetch(`${this.config.baseUrl}${loginPath}`, {
|
|
807
|
+
method: "POST",
|
|
808
|
+
headers: {
|
|
809
|
+
Accept: "application/json, text/plain;q=0.9",
|
|
810
|
+
"Content-Type": "application/json"
|
|
811
|
+
},
|
|
812
|
+
body,
|
|
813
|
+
signal: loginController.signal
|
|
814
|
+
});
|
|
815
|
+
} finally {
|
|
816
|
+
clearTimeout(loginTimeoutId);
|
|
817
|
+
}
|
|
766
818
|
if (!response.ok) {
|
|
767
819
|
await response.text();
|
|
768
820
|
throw new Error(`TeamDynamix authentication failed (${response.status}).`);
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/constants.ts","../src/resources/teamdynamix.resources.ts","../src/services/teamdynamix/core.service.ts","../src/tools/teamdynamix.domain-gateways.tools.ts","../src/schemas/teamdynamix/index.ts","../src/schemas/index.ts","../src/services/teamdynamix/client.service.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { LOG_LEVEL, SERVER_NAME_OVERRIDE, SERVER_VERSION_OVERRIDE, getTeamDynamixConfig } from './config.js';\nimport { SERVER_NAME, SERVER_VERSION } from './constants.js';\nimport { registerTeamDynamixResources } from './resources/teamdynamix.resources.js';\nimport { redactTeamDynamixConfig } from './services/teamdynamix/core.service.js';\nimport { registerTeamDynamixDomainGatewayTools } from './tools/teamdynamix.domain-gateways.tools.js';\n\nconst server = new McpServer({\n name: SERVER_NAME_OVERRIDE ?? SERVER_NAME,\n version: SERVER_VERSION_OVERRIDE ?? SERVER_VERSION,\n});\n\nregisterTeamDynamixDomainGatewayTools(server);\nregisterTeamDynamixResources(server);\n\nasync function main(): Promise<void> {\n console.error(`[teamdynamix-mcp] log level: ${LOG_LEVEL}`);\n if (LOG_LEVEL === 'debug') {\n const config = getTeamDynamixConfig();\n console.error(`[teamdynamix-mcp] sanitized config: ${JSON.stringify(redactTeamDynamixConfig(config))}`);\n }\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Server startup failed: ${message}`);\n process.exit(1);\n});\n","import { z } from 'zod';\nimport {\n TEAMDYNAMIX_DEFAULT_MAX_RETRIES,\n TEAMDYNAMIX_DEFAULT_TIMEOUT_MS,\n TEAMDYNAMIX_MAX_RETRY_ATTEMPTS,\n} from './constants.js';\nimport type { TeamDynamixAuthMode, TeamDynamixConfig, TeamDynamixConfigStatus } from './types.js';\n\n/**\n * Optional server name override.\n */\nexport const SERVER_NAME_OVERRIDE: string | undefined = process.env['MCP_SERVER_NAME']?.trim() || undefined;\n\n/**\n * Optional server version override.\n */\nexport const SERVER_VERSION_OVERRIDE: string | undefined = process.env['MCP_SERVER_VERSION']?.trim() || undefined;\n\n/**\n * Runtime log level used by starter tools and resources.\n */\nexport const LOG_LEVEL: 'debug' | 'info' | 'warn' | 'error' =\n process.env['MCP_LOG_LEVEL'] === 'debug' ||\n process.env['MCP_LOG_LEVEL'] === 'warn' ||\n process.env['MCP_LOG_LEVEL'] === 'error'\n ? process.env['MCP_LOG_LEVEL']\n : 'info';\n\nfunction normalizeOptionalString(value: string | undefined): string | undefined {\n const normalized = value?.trim();\n return normalized ? normalized : undefined;\n}\n\nfunction normalizeOptionalNumber(value: string | undefined): number | undefined {\n if (!value?.trim()) {\n return undefined;\n }\n\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction normalizeBoolean(value: string | undefined, defaultValue: boolean): boolean {\n if (!value) {\n return defaultValue;\n }\n\n const normalized = value.trim().toLowerCase();\n if (normalized === 'true') return true;\n if (normalized === 'false') return false;\n return defaultValue;\n}\n\nfunction normalizeNumberWithDefault(value: string | undefined, defaultValue: number, minimum: number): number {\n if (!value?.trim()) {\n return defaultValue;\n }\n\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed >= minimum ? parsed : defaultValue;\n}\n\nfunction normalizeTeamDynamixBaseUrl(value: string | undefined): string | undefined {\n const normalized = normalizeOptionalString(value);\n return normalized ? normalized.replace(/\\/+$/, '') : undefined;\n}\n\nfunction validateHttpsBaseUrl(value: string | undefined): string | undefined {\n if (!value) return undefined;\n\n const schema = z\n .string()\n .url()\n .refine(url => url.startsWith('https://'), {\n message: 'TEAMDYNAMIX_BASE_URL must be an https URL.',\n });\n\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n throw new Error(parsed.error.issues[0]?.message ?? 'Invalid TEAMDYNAMIX_BASE_URL.');\n }\n\n return value;\n}\n\nfunction normalizeTeamDynamixAuthMode(value: string | undefined): TeamDynamixAuthMode {\n return value?.trim().toLowerCase() === 'admin' ? 'admin' : 'standard';\n}\n\nexport function getTeamDynamixConfig(): TeamDynamixConfig {\n const baseUrl = validateHttpsBaseUrl(normalizeTeamDynamixBaseUrl(process.env['TEAMDYNAMIX_BASE_URL']));\n const maxRetries = normalizeNumberWithDefault(\n process.env['TEAMDYNAMIX_MAX_RETRIES'],\n TEAMDYNAMIX_DEFAULT_MAX_RETRIES,\n 0,\n );\n if (maxRetries > 5) {\n throw new Error(`TEAMDYNAMIX_MAX_RETRIES must be between 0 and ${TEAMDYNAMIX_MAX_RETRY_ATTEMPTS}.`);\n }\n\n return {\n baseUrl,\n authMode: normalizeTeamDynamixAuthMode(process.env['TEAMDYNAMIX_AUTH_MODE']),\n username: normalizeOptionalString(process.env['TEAMDYNAMIX_USERNAME']),\n password: normalizeOptionalString(process.env['TEAMDYNAMIX_PASSWORD']),\n beid: normalizeOptionalString(process.env['TEAMDYNAMIX_BEID']),\n webServicesKey: normalizeOptionalString(process.env['TEAMDYNAMIX_WEB_SERVICES_KEY']),\n defaultTicketAppId: normalizeOptionalNumber(process.env['TEAMDYNAMIX_DEFAULT_TICKET_APP_ID']),\n defaultAssetAppId: normalizeOptionalNumber(process.env['TEAMDYNAMIX_DEFAULT_ASSET_APP_ID']),\n defaultKnowledgeBaseAppId: normalizeOptionalNumber(process.env['TEAMDYNAMIX_DEFAULT_KB_APP_ID']),\n timeoutMs: normalizeNumberWithDefault(process.env['TEAMDYNAMIX_TIMEOUT_MS'], TEAMDYNAMIX_DEFAULT_TIMEOUT_MS, 1_000),\n maxRetries,\n enableWriteTools: normalizeBoolean(process.env['TEAMDYNAMIX_ENABLE_WRITE_TOOLS'], false),\n enableAdminTools: normalizeBoolean(process.env['TEAMDYNAMIX_ENABLE_ADMIN_TOOLS'], false),\n };\n}\n\nexport function getTeamDynamixConfigStatus(\n config: TeamDynamixConfig = getTeamDynamixConfig(),\n): TeamDynamixConfigStatus {\n const missing = new Set<string>();\n\n if (!config.baseUrl) {\n missing.add('TEAMDYNAMIX_BASE_URL');\n }\n\n if (config.authMode === 'admin') {\n if (!config.beid) missing.add('TEAMDYNAMIX_BEID');\n if (!config.webServicesKey) missing.add('TEAMDYNAMIX_WEB_SERVICES_KEY');\n } else {\n if (!config.username) missing.add('TEAMDYNAMIX_USERNAME');\n if (!config.password) missing.add('TEAMDYNAMIX_PASSWORD');\n }\n\n return {\n configured: missing.size === 0,\n missing: [...missing],\n authMode: config.authMode,\n };\n}\n","export const SERVER_NAME = 'teamdynamix-mcp';\nexport const SERVER_VERSION = '0.2.0';\nexport const CHARACTER_LIMIT = 25_000;\nexport const TEAMDYNAMIX_TOOL_PREFIX = 'teamdynamix';\nexport const TEAMDYNAMIX_DEFAULT_TIMEOUT_MS = 30_000;\nexport const TEAMDYNAMIX_DEFAULT_MAX_RETRIES = 2;\nexport const TEAMDYNAMIX_MAX_RETRY_ATTEMPTS = 5;\nexport const TEAMDYNAMIX_MIN_RATE_LIMIT_WAIT_MS = 5_000;\nexport const TEAMDYNAMIX_MAX_RATE_LIMIT_WAIT_MS = 30_000;\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { getTeamDynamixConfig, getTeamDynamixConfigStatus } from '../config.js';\nimport { redactTeamDynamixConfig } from '../services/teamdynamix/core.service.js';\nimport { TEAMDYNAMIX_GATEWAY_SURFACE } from '../tools/teamdynamix.domain-gateways.tools.js';\n\nfunction stringify(data: unknown): string {\n return JSON.stringify(data, null, 2);\n}\n\nexport function registerTeamDynamixResources(server: McpServer): void {\n const resourceConfig = { list: undefined };\n\n server.registerResource(\n 'teamdynamix_capabilities',\n new ResourceTemplate('teamdynamix://capabilities', resourceConfig),\n {\n title: 'TeamDynamix Capabilities',\n description: 'Read-only snapshot of the currently implemented TeamDynamix MCP surface.',\n mimeType: 'application/json',\n },\n async uri => {\n const capabilities = {\n toolGroups: {\n discovery: [TEAMDYNAMIX_GATEWAY_SURFACE.discovery.tool],\n tickets: [TEAMDYNAMIX_GATEWAY_SURFACE.tickets.tool],\n ticket_relationships: [TEAMDYNAMIX_GATEWAY_SURFACE.ticketRelationships.tool],\n people: [TEAMDYNAMIX_GATEWAY_SURFACE.people.tool],\n knowledge_base: [TEAMDYNAMIX_GATEWAY_SURFACE.knowledgeBase.tool],\n assets: [TEAMDYNAMIX_GATEWAY_SURFACE.assets.tool],\n cmdb: [TEAMDYNAMIX_GATEWAY_SURFACE.cmdb.tool],\n services: [TEAMDYNAMIX_GATEWAY_SURFACE.services.tool],\n projects: [TEAMDYNAMIX_GATEWAY_SURFACE.projects.tool],\n time: [TEAMDYNAMIX_GATEWAY_SURFACE.time.tool],\n reference_data: [TEAMDYNAMIX_GATEWAY_SURFACE.referenceData.tool],\n },\n gatewayActions: {\n discovery: TEAMDYNAMIX_GATEWAY_SURFACE.discovery.actions,\n tickets: TEAMDYNAMIX_GATEWAY_SURFACE.tickets.actions,\n ticket_relationships: TEAMDYNAMIX_GATEWAY_SURFACE.ticketRelationships.actions,\n people: TEAMDYNAMIX_GATEWAY_SURFACE.people.actions,\n knowledge_base: TEAMDYNAMIX_GATEWAY_SURFACE.knowledgeBase.actions,\n assets: TEAMDYNAMIX_GATEWAY_SURFACE.assets.actions,\n cmdb: TEAMDYNAMIX_GATEWAY_SURFACE.cmdb.actions,\n services: TEAMDYNAMIX_GATEWAY_SURFACE.services.actions,\n projects: TEAMDYNAMIX_GATEWAY_SURFACE.projects.actions,\n time: TEAMDYNAMIX_GATEWAY_SURFACE.time.actions,\n reference_data: TEAMDYNAMIX_GATEWAY_SURFACE.referenceData.actions,\n },\n implementedDomains: [\n 'discovery',\n 'tickets',\n 'ticket_relationships',\n 'people',\n 'knowledge_base',\n 'assets',\n 'cmdb',\n 'services',\n 'projects',\n 'time',\n 'reference_data',\n ],\n };\n\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify(capabilities) }],\n };\n },\n );\n\n server.registerResource(\n 'teamdynamix_config',\n new ResourceTemplate('teamdynamix://config', resourceConfig),\n {\n title: 'TeamDynamix Runtime Config',\n description: 'Read-only sanitized TeamDynamix configuration and readiness metadata.',\n mimeType: 'application/json',\n },\n async uri => {\n const runtimeConfig = getTeamDynamixConfig();\n const config = {\n status: getTeamDynamixConfigStatus(runtimeConfig),\n config: redactTeamDynamixConfig(runtimeConfig),\n };\n\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify(config) }],\n };\n },\n );\n}\n","import { TEAMDYNAMIX_MAX_RATE_LIMIT_WAIT_MS, TEAMDYNAMIX_MIN_RATE_LIMIT_WAIT_MS } from '../../constants.js';\nimport type { TeamDynamixConfig, TeamDynamixJsonPatchOperation, TeamDynamixRateLimit } from '../../types.js';\n\nfunction normalizePatchPath(path: string): string {\n const withLeadingSlash = path.startsWith('/') ? path : `/${path}`;\n const segments = withLeadingSlash.split('/');\n return segments\n .map((segment, index) => {\n if (index === 0 || segment.length === 0) {\n return segment;\n }\n\n return /^\\d+$/.test(segment) ? segment : segment.toLowerCase();\n })\n .join('/');\n}\n\nexport function buildTeamDynamixJsonPatchDocument(\n operations: readonly TeamDynamixJsonPatchOperation[],\n): readonly TeamDynamixJsonPatchOperation[] {\n return operations.map(operation => {\n if (operation.op === 'remove') {\n return {\n op: operation.op,\n path: normalizePatchPath(operation.path),\n };\n }\n\n return {\n op: operation.op,\n path: normalizePatchPath(operation.path),\n value: operation.value ?? null,\n };\n });\n}\n\nexport function toTeamDynamixDateTime(value: Date | string): string {\n const date = value instanceof Date ? value : new Date(value);\n return date.toISOString();\n}\n\nexport function toTeamDynamixDateOnly(value: Date | string): string {\n const date = value instanceof Date ? value : new Date(value);\n return date.toISOString().slice(0, 10);\n}\n\nexport function parseRateLimit(headers: Headers, nowMs = Date.now()): TeamDynamixRateLimit {\n const limitRaw = headers.get('X-RateLimit-Limit');\n const remainingRaw = headers.get('X-RateLimit-Remaining');\n const resetRaw = headers.get('X-RateLimit-Reset');\n const resetTime = resetRaw ? Date.parse(resetRaw) : Number.NaN;\n const computedWaitMs = Number.isFinite(resetTime) ? resetTime - nowMs : TEAMDYNAMIX_MIN_RATE_LIMIT_WAIT_MS;\n const waitMs = Math.min(\n Math.max(\n Number.isFinite(computedWaitMs) ? computedWaitMs : TEAMDYNAMIX_MIN_RATE_LIMIT_WAIT_MS,\n TEAMDYNAMIX_MIN_RATE_LIMIT_WAIT_MS,\n ),\n TEAMDYNAMIX_MAX_RATE_LIMIT_WAIT_MS,\n );\n\n return {\n limit: limitRaw ? Number.parseInt(limitRaw, 10) : null,\n remaining: remainingRaw ? Number.parseInt(remainingRaw, 10) : null,\n resetAt: Number.isFinite(resetTime) ? new Date(resetTime).toISOString() : null,\n waitMs,\n };\n}\n\nexport function redactTeamDynamixConfig(config: TeamDynamixConfig): Record<string, unknown> {\n return {\n baseUrl: config.baseUrl ?? null,\n authMode: config.authMode,\n username: config.username ? '[configured]' : null,\n password: config.password ? '[configured]' : null,\n beid: config.beid ? '[configured]' : null,\n webServicesKey: config.webServicesKey ? '[configured]' : null,\n defaultTicketAppId: config.defaultTicketAppId ?? null,\n defaultAssetAppId: config.defaultAssetAppId ?? null,\n defaultKnowledgeBaseAppId: config.defaultKnowledgeBaseAppId ?? null,\n timeoutMs: config.timeoutMs,\n maxRetries: config.maxRetries,\n enableWriteTools: config.enableWriteTools,\n enableAdminTools: config.enableAdminTools,\n };\n}\n\nexport function decodeJwtExpiryEpochSeconds(token: string): number | null {\n const segments = token.split('.');\n const payload = segments[1];\n if (!payload) {\n return null;\n }\n\n try {\n const normalized = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padding = normalized.length % 4 === 0 ? '' : '='.repeat(4 - (normalized.length % 4));\n const decoded = Buffer.from(`${normalized}${padding}`, 'base64').toString('utf8');\n const parsed = JSON.parse(decoded) as { exp?: unknown };\n return typeof parsed.exp === 'number' ? parsed.exp : null;\n } catch {\n return null;\n }\n}\n\nexport function extractAuthToken(payload: unknown): string {\n if (typeof payload === 'string' && payload.trim()) {\n return payload.trim();\n }\n\n if (!payload || typeof payload !== 'object') {\n throw new Error('Unable to extract bearer token from TeamDynamix authentication response.');\n }\n\n const record = payload as Record<string, unknown>;\n const candidateKeys = ['token', 'Token', 'accessToken', 'AccessToken', 'bearerToken', 'TokenText', 'value'];\n for (const key of candidateKeys) {\n const candidate = record[key];\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n throw new Error('Unable to extract bearer token from TeamDynamix authentication response.');\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { getTeamDynamixConfig, getTeamDynamixConfigStatus } from '../config.js';\nimport { TEAMDYNAMIX_TOOL_PREFIX } from '../constants.js';\nimport {\n AssetSearchSchema,\n CiSearchSchema,\n CustomAttributeComponentIdSchema,\n GroupSearchSchema,\n KbArticleCreateSchema,\n KbArticleSearchSchema,\n KbArticleUpdateSchema,\n ProjectIssueCreateSchema,\n ProjectRiskCreateSchema,\n ProjectSearchSchema,\n ServiceSearchSchema,\n TeamDynamixAppIdSchema,\n TeamDynamixGuidSchema,\n TeamDynamixResponseFormatSchema,\n TicketCommentSchema,\n TicketCreateSchema,\n TicketPatchSchema,\n TicketSearchSchema,\n TicketTaskCreateSchema,\n TimeEntryQuerySchema,\n UserSearchSchema,\n} from '../schemas/teamdynamix/index.js';\nimport { assertWriteToolsEnabled, createConfiguredTeamDynamixClient } from '../services/teamdynamix/client.service.js';\nimport { redactTeamDynamixConfig } from '../services/teamdynamix/core.service.js';\nimport type { ResponseFormat } from '../types.js';\n\nconst teamdynamixDiscoveryActionSchema = z.enum([\n 'server_status',\n 'get_current_user',\n 'list_applications',\n 'list_ticket_statuses',\n]);\n\nconst teamdynamixTicketActionSchema = z.enum([\n 'list_ticket_types',\n 'list_ticket_priorities',\n 'list_ticket_urgencies',\n 'list_ticket_impacts',\n 'list_ticket_sources',\n 'get_ticket',\n 'search_tickets',\n 'create_ticket',\n 'update_ticket',\n 'add_ticket_comment',\n 'get_ticket_feed',\n]);\n\nconst teamdynamixTicketRelationshipActionSchema = z.enum([\n 'get_ticket_tasks',\n 'create_ticket_task',\n 'list_ticket_assets',\n 'add_ticket_asset',\n 'remove_ticket_asset',\n 'get_ticket_contacts',\n 'add_ticket_contact',\n 'remove_ticket_contact',\n]);\n\nconst teamdynamixPeopleActionSchema = z.enum([\n 'get_user',\n 'search_users',\n 'get_group',\n 'search_groups',\n 'get_group_members',\n]);\n\nconst teamdynamixKnowledgeBaseActionSchema = z.enum([\n 'get_kb_article',\n 'search_kb_articles',\n 'list_kb_categories',\n 'create_kb_article',\n 'update_kb_article',\n]);\n\nconst teamdynamixAssetsActionSchema = z.enum([\n 'get_asset',\n 'search_assets',\n 'list_asset_statuses',\n 'list_product_models',\n]);\n\nconst teamdynamixCmdbActionSchema = z.enum([\n 'get_ci',\n 'search_cis',\n 'list_ci_types',\n 'list_ci_relationship_types',\n 'list_vendors',\n]);\n\nconst teamdynamixServicesActionSchema = z.enum([\n 'list_services',\n 'get_service',\n 'search_services',\n 'list_service_categories',\n]);\n\nconst teamdynamixProjectsActionSchema = z.enum([\n 'get_project',\n 'search_projects',\n 'list_project_types',\n 'get_project_plans',\n 'get_project_issues',\n 'get_project_risks',\n 'create_project_issue',\n 'create_project_risk',\n]);\n\nconst teamdynamixTimeActionSchema = z.enum(['list_time_types', 'get_my_time_entries']);\n\nconst teamdynamixReferenceDataActionSchema = z.enum([\n 'list_accounts',\n 'get_account',\n 'list_locations',\n 'list_functional_roles',\n 'list_custom_attributes',\n]);\n\nconst gatewayPayloadSchema = z.record(z.string(), z.unknown()).default({});\n\nfunction render(data: unknown, responseFormat: ResponseFormat): string {\n if (responseFormat === 'json') return JSON.stringify(data, null, 2);\n if (typeof data === 'string') return data;\n return JSON.stringify(data, null, 2);\n}\n\nfunction messageFromError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toStructuredContent(payload: unknown): Record<string, unknown> {\n if (typeof payload === 'object' && payload !== null && !Array.isArray(payload)) {\n return payload as Record<string, unknown>;\n }\n\n return {\n data: payload,\n };\n}\n\nfunction parsePayload<TSchema extends z.ZodTypeAny>(\n schema: TSchema,\n payload: Record<string, unknown>,\n action: string,\n): z.infer<TSchema> {\n const parsed = schema.safeParse(payload);\n if (!parsed.success) {\n const details = parsed.error.issues\n .map(issue => `${issue.path.join('.') || '<root>'}: ${issue.message}`)\n .join('; ');\n throw new Error(`Invalid payload for action \"${action}\": ${details}`);\n }\n return parsed.data;\n}\n\nfunction toSuccessResponse(payload: unknown, responseFormat: ResponseFormat) {\n return {\n content: [{ type: 'text' as const, text: render(payload, responseFormat) }],\n structuredContent: toStructuredContent(payload),\n };\n}\n\nfunction toErrorResponse(error: unknown) {\n const message = messageFromError(error);\n\n return {\n content: [{ type: 'text' as const, text: `Error: ${message}` }],\n structuredContent: {\n ok: false,\n kind: 'unknown',\n message,\n },\n isError: true,\n };\n}\n\nconst teamdynamixDiscoveryTool = `${TEAMDYNAMIX_TOOL_PREFIX}_discovery`;\nconst teamdynamixTicketsTool = `${TEAMDYNAMIX_TOOL_PREFIX}_tickets`;\nconst teamdynamixTicketRelationshipsTool = `${TEAMDYNAMIX_TOOL_PREFIX}_ticket_relationships`;\nconst teamdynamixPeopleTool = `${TEAMDYNAMIX_TOOL_PREFIX}_people`;\nconst teamdynamixKnowledgeBaseTool = `${TEAMDYNAMIX_TOOL_PREFIX}_knowledge_base`;\nconst teamdynamixAssetsTool = `${TEAMDYNAMIX_TOOL_PREFIX}_assets`;\nconst teamdynamixCmdbTool = `${TEAMDYNAMIX_TOOL_PREFIX}_cmdb`;\nconst teamdynamixServicesTool = `${TEAMDYNAMIX_TOOL_PREFIX}_services`;\nconst teamdynamixProjectsTool = `${TEAMDYNAMIX_TOOL_PREFIX}_projects`;\nconst teamdynamixTimeTool = `${TEAMDYNAMIX_TOOL_PREFIX}_time`;\nconst teamdynamixReferenceDataTool = `${TEAMDYNAMIX_TOOL_PREFIX}_reference_data`;\n\nexport const TEAMDYNAMIX_GATEWAY_SURFACE = {\n discovery: {\n tool: teamdynamixDiscoveryTool,\n actions: teamdynamixDiscoveryActionSchema.options,\n },\n tickets: {\n tool: teamdynamixTicketsTool,\n actions: teamdynamixTicketActionSchema.options,\n },\n ticketRelationships: {\n tool: teamdynamixTicketRelationshipsTool,\n actions: teamdynamixTicketRelationshipActionSchema.options,\n },\n people: {\n tool: teamdynamixPeopleTool,\n actions: teamdynamixPeopleActionSchema.options,\n },\n knowledgeBase: {\n tool: teamdynamixKnowledgeBaseTool,\n actions: teamdynamixKnowledgeBaseActionSchema.options,\n },\n assets: {\n tool: teamdynamixAssetsTool,\n actions: teamdynamixAssetsActionSchema.options,\n },\n cmdb: {\n tool: teamdynamixCmdbTool,\n actions: teamdynamixCmdbActionSchema.options,\n },\n services: {\n tool: teamdynamixServicesTool,\n actions: teamdynamixServicesActionSchema.options,\n },\n projects: {\n tool: teamdynamixProjectsTool,\n actions: teamdynamixProjectsActionSchema.options,\n },\n time: {\n tool: teamdynamixTimeTool,\n actions: teamdynamixTimeActionSchema.options,\n },\n referenceData: {\n tool: teamdynamixReferenceDataTool,\n actions: teamdynamixReferenceDataActionSchema.options,\n },\n} as const;\n\nexport function registerTeamDynamixDomainGatewayTools(server: McpServer): void {\n registerTeamDynamixDiscoveryGateway(server);\n registerTeamDynamixTicketsGateway(server);\n registerTeamDynamixTicketRelationshipsGateway(server);\n registerTeamDynamixPeopleGateway(server);\n registerTeamDynamixKnowledgeBaseGateway(server);\n registerTeamDynamixAssetsGateway(server);\n registerTeamDynamixCmdbGateway(server);\n registerTeamDynamixServicesGateway(server);\n registerTeamDynamixProjectsGateway(server);\n registerTeamDynamixTimeGateway(server);\n registerTeamDynamixReferenceDataGateway(server);\n}\n\nfunction registerTeamDynamixDiscoveryGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixDiscoveryTool,\n {\n title: 'TeamDynamix Discovery Gateway',\n description:\n 'Gateway for discovery operations: server status, current user, applications, and ticket status lookup.',\n inputSchema: {\n action: teamdynamixDiscoveryActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'server_status': {\n const config = getTeamDynamixConfig();\n const status = getTeamDynamixConfigStatus(config);\n const result = {\n status,\n config: redactTeamDynamixConfig(config),\n gateway: 'discovery',\n actions: TEAMDYNAMIX_GATEWAY_SURFACE.discovery.actions,\n };\n return toSuccessResponse(result, response_format);\n }\n case 'get_current_user': {\n const user = await client.getCurrentUser();\n return toSuccessResponse(user, response_format);\n }\n case 'list_applications': {\n const applications = await client.listApplications();\n return toSuccessResponse({ count: applications.length, applications }, response_format);\n }\n case 'list_ticket_statuses': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema.optional() }), payload, action);\n const config = getTeamDynamixConfig();\n const effectiveAppId = parsed.app_id ?? config.defaultTicketAppId;\n if (!effectiveAppId) {\n throw new Error(\n 'No TeamDynamix ticket application ID was provided. Supply payload.app_id or configure TEAMDYNAMIX_DEFAULT_TICKET_APP_ID.',\n );\n }\n const statuses = await client.listTicketStatuses(effectiveAppId);\n return toSuccessResponse({ appId: effectiveAppId, count: statuses.length, statuses }, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixTicketsGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixTicketsTool,\n {\n title: 'TeamDynamix Tickets Gateway',\n description: 'Gateway for ticket metadata, read/search, create/update, comments, and feed operations.',\n inputSchema: {\n action: teamdynamixTicketActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: false, idempotentHint: false, destructiveHint: true, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'list_ticket_types': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const types = await client.listTicketTypes(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, types }, response_format);\n }\n case 'list_ticket_priorities': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const priorities = await client.listTicketPriorities(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, priorities }, response_format);\n }\n case 'list_ticket_urgencies': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const urgencies = await client.listTicketUrgencies(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, urgencies }, response_format);\n }\n case 'list_ticket_impacts': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const impacts = await client.listTicketImpacts(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, impacts }, response_format);\n }\n case 'list_ticket_sources': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const sources = await client.listTicketSources(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, sources }, response_format);\n }\n case 'get_ticket': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, ticket_id: z.number().int().positive() }),\n payload,\n action,\n );\n const ticket = await client.getTicket(parsed.app_id, parsed.ticket_id);\n return toSuccessResponse(ticket, response_format);\n }\n case 'search_tickets': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, search: TicketSearchSchema }),\n payload,\n action,\n );\n const tickets = await client.searchTickets(parsed.app_id, parsed.search as Record<string, unknown>);\n return toSuccessResponse({ appId: parsed.app_id, count: tickets.length, tickets }, response_format);\n }\n case 'create_ticket': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n ticket: TicketCreateSchema,\n notify_requestor: z.boolean().optional().default(false),\n notify_responsible: z.boolean().optional().default(false),\n }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const created = await client.createTicket(\n parsed.app_id,\n parsed.ticket as Record<string, unknown>,\n parsed.notify_requestor,\n parsed.notify_responsible,\n );\n return toSuccessResponse(created, response_format);\n }\n case 'update_ticket': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, patch: TicketPatchSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const updated = await client.updateTicket(\n parsed.app_id,\n parsed.patch.TicketID,\n parsed.patch.Attributes as Record<string, unknown>,\n parsed.patch.NotifyRequestor ?? false,\n parsed.patch.NotifyResponsible ?? false,\n parsed.patch.Comments ?? '',\n parsed.patch.IsPrivate ?? false,\n );\n return toSuccessResponse(updated, response_format);\n }\n case 'add_ticket_comment': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, comment: TicketCommentSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const entry = await client.addTicketComment(\n parsed.app_id,\n parsed.comment.TicketID,\n parsed.comment.Body,\n parsed.comment.IsPrivate ?? false,\n parsed.comment.NotifyRequestor ?? false,\n parsed.comment.NotifyResponsible ?? false,\n );\n return toSuccessResponse(entry, response_format);\n }\n case 'get_ticket_feed': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, ticket_id: z.number().int().positive() }),\n payload,\n action,\n );\n const feed = await client.getTicketFeed(parsed.app_id, parsed.ticket_id);\n return toSuccessResponse(\n { appId: parsed.app_id, ticketId: parsed.ticket_id, entries: feed },\n response_format,\n );\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixTicketRelationshipsGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixTicketRelationshipsTool,\n {\n title: 'TeamDynamix Ticket Relationships Gateway',\n description: 'Gateway for ticket tasks, linked assets, and linked contacts operations.',\n inputSchema: {\n action: teamdynamixTicketRelationshipActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: false, idempotentHint: false, destructiveHint: true, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'get_ticket_tasks': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, ticket_id: z.number().int().positive() }),\n payload,\n action,\n );\n const tasks = await client.getTicketTasks(parsed.app_id, parsed.ticket_id);\n return toSuccessResponse(\n { appId: parsed.app_id, ticketId: parsed.ticket_id, count: tasks.length, tasks },\n response_format,\n );\n }\n case 'create_ticket_task': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, task: TicketTaskCreateSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const created = await client.createTicketTask(\n parsed.app_id,\n parsed.task.TicketID,\n parsed.task as Record<string, unknown>,\n );\n return toSuccessResponse(created, response_format);\n }\n case 'list_ticket_assets': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, ticket_id: z.number().int().positive() }),\n payload,\n action,\n );\n const assets = await client.listTicketAssets(parsed.app_id, parsed.ticket_id);\n return toSuccessResponse(\n { appId: parsed.app_id, ticketId: parsed.ticket_id, count: assets.length, assets },\n response_format,\n );\n }\n case 'add_ticket_asset': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n ticket_id: z.number().int().positive(),\n asset_id: z.number().int().positive(),\n }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const result = await client.addTicketAsset(parsed.app_id, parsed.ticket_id, parsed.asset_id);\n return toSuccessResponse(result, response_format);\n }\n case 'remove_ticket_asset': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n ticket_id: z.number().int().positive(),\n asset_id: z.number().int().positive(),\n confirm: z.literal(true),\n }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n await client.removeTicketAsset(parsed.app_id, parsed.ticket_id, parsed.asset_id);\n return toSuccessResponse(\n {\n appId: parsed.app_id,\n ticketId: parsed.ticket_id,\n assetId: parsed.asset_id,\n unlinked: true,\n },\n response_format,\n );\n }\n case 'get_ticket_contacts': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, ticket_id: z.number().int().positive() }),\n payload,\n action,\n );\n const contacts = await client.getTicketContacts(parsed.app_id, parsed.ticket_id);\n return toSuccessResponse(\n { appId: parsed.app_id, ticketId: parsed.ticket_id, count: contacts.length, contacts },\n response_format,\n );\n }\n case 'add_ticket_contact': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n ticket_id: z.number().int().positive(),\n contact_uid: TeamDynamixGuidSchema,\n }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const result = await client.addTicketContact(parsed.app_id, parsed.ticket_id, parsed.contact_uid);\n return toSuccessResponse(result, response_format);\n }\n case 'remove_ticket_contact': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n ticket_id: z.number().int().positive(),\n contact_uid: TeamDynamixGuidSchema,\n confirm: z.literal(true),\n }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n await client.removeTicketContact(parsed.app_id, parsed.ticket_id, parsed.contact_uid);\n return toSuccessResponse(\n {\n appId: parsed.app_id,\n ticketId: parsed.ticket_id,\n contactUid: parsed.contact_uid,\n removed: true,\n },\n response_format,\n );\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixPeopleGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixPeopleTool,\n {\n title: 'TeamDynamix People Gateway',\n description: 'Gateway for user and group retrieval/search operations.',\n inputSchema: {\n action: teamdynamixPeopleActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'get_user': {\n const parsed = parsePayload(z.object({ uid: TeamDynamixGuidSchema }), payload, action);\n const user = await client.getUser(parsed.uid);\n return toSuccessResponse(user, response_format);\n }\n case 'search_users': {\n const parsed = parsePayload(z.object({ search: UserSearchSchema }), payload, action);\n const users = await client.searchUsers(parsed.search as Record<string, unknown>);\n return toSuccessResponse({ count: users.length, users }, response_format);\n }\n case 'get_group': {\n const parsed = parsePayload(z.object({ group_id: z.number().int().positive() }), payload, action);\n const group = await client.getGroup(parsed.group_id);\n return toSuccessResponse(group, response_format);\n }\n case 'search_groups': {\n const parsed = parsePayload(z.object({ search: GroupSearchSchema }), payload, action);\n const groups = await client.searchGroups(parsed.search as Record<string, unknown>);\n return toSuccessResponse({ count: groups.length, groups }, response_format);\n }\n case 'get_group_members': {\n const parsed = parsePayload(z.object({ group_id: z.number().int().positive() }), payload, action);\n const members = await client.getGroupMembers(parsed.group_id);\n return toSuccessResponse({ groupId: parsed.group_id, count: members.length, members }, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixKnowledgeBaseGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixKnowledgeBaseTool,\n {\n title: 'TeamDynamix Knowledge Base Gateway',\n description: 'Gateway for TeamDynamix Knowledge Base retrieval, search, and write operations.',\n inputSchema: {\n action: teamdynamixKnowledgeBaseActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: false, idempotentHint: false, destructiveHint: true, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'get_kb_article': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, article_id: z.number().int().positive() }),\n payload,\n action,\n );\n const article = await client.getKbArticle(parsed.app_id, parsed.article_id);\n return toSuccessResponse(article, response_format);\n }\n case 'search_kb_articles': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, search: KbArticleSearchSchema }),\n payload,\n action,\n );\n const articles = await client.searchKbArticles(parsed.app_id, parsed.search as Record<string, unknown>);\n return toSuccessResponse({ appId: parsed.app_id, count: articles.length, articles }, response_format);\n }\n case 'list_kb_categories': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const categories = await client.listKbCategories(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: categories.length, categories }, response_format);\n }\n case 'create_kb_article': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, article: KbArticleCreateSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const created = await client.createKbArticle(parsed.app_id, parsed.article as Record<string, unknown>);\n return toSuccessResponse(created, response_format);\n }\n case 'update_kb_article': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, article: KbArticleUpdateSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const { ArticleID, ...body } = parsed.article;\n const updated = await client.updateKbArticle(parsed.app_id, ArticleID, body as Record<string, unknown>);\n return toSuccessResponse(updated, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixAssetsGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixAssetsTool,\n {\n title: 'TeamDynamix Assets Gateway',\n description: 'Gateway for TeamDynamix asset retrieval, search, and lookup enumerations.',\n inputSchema: {\n action: teamdynamixAssetsActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'get_asset': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, asset_id: z.number().int().positive() }),\n payload,\n action,\n );\n const asset = await client.getAsset(parsed.app_id, parsed.asset_id);\n return toSuccessResponse(asset, response_format);\n }\n case 'search_assets': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, search: AssetSearchSchema }),\n payload,\n action,\n );\n const assets = await client.searchAssets(parsed.app_id, parsed.search as Record<string, unknown>);\n return toSuccessResponse({ appId: parsed.app_id, count: assets.length, assets }, response_format);\n }\n case 'list_asset_statuses': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const statuses = await client.listAssetStatuses(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: statuses.length, statuses }, response_format);\n }\n case 'list_product_models': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const models = await client.listProductModels(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: models.length, models }, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixCmdbGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixCmdbTool,\n {\n title: 'TeamDynamix CMDB Gateway',\n description: 'Gateway for CI/CMDB retrieval, search, types, relationship types, and vendors.',\n inputSchema: {\n action: teamdynamixCmdbActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'get_ci': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, ci_id: z.number().int().positive() }),\n payload,\n action,\n );\n const ci = await client.getConfigurationItem(parsed.app_id, parsed.ci_id);\n return toSuccessResponse(ci, response_format);\n }\n case 'search_cis': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, search: CiSearchSchema }),\n payload,\n action,\n );\n const results = await client.searchConfigurationItems(\n parsed.app_id,\n parsed.search as Record<string, unknown>,\n );\n return toSuccessResponse({ appId: parsed.app_id, count: results.length, results }, response_format);\n }\n case 'list_ci_types': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const types = await client.listCiTypes(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: types.length, types }, response_format);\n }\n case 'list_ci_relationship_types': {\n const types = await client.listCiRelationshipTypes();\n return toSuccessResponse({ count: types.length, types }, response_format);\n }\n case 'list_vendors': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const vendors = await client.listVendors(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: vendors.length, vendors }, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixServicesGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixServicesTool,\n {\n title: 'TeamDynamix Services Gateway',\n description: 'Gateway for TeamDynamix service catalog list/get/search/category operations.',\n inputSchema: {\n action: teamdynamixServicesActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'list_services': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const services = await client.listServiceCatalog(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: services.length, services }, response_format);\n }\n case 'get_service': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, service_id: z.number().int().positive() }),\n payload,\n action,\n );\n const service = await client.getService(parsed.app_id, parsed.service_id);\n return toSuccessResponse(service, response_format);\n }\n case 'search_services': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, search: ServiceSearchSchema }),\n payload,\n action,\n );\n const services = await client.searchServices(parsed.app_id, parsed.search as Record<string, unknown>);\n return toSuccessResponse({ appId: parsed.app_id, count: services.length, services }, response_format);\n }\n case 'list_service_categories': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const categories = await client.listServiceCategories(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: categories.length, categories }, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixProjectsGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixProjectsTool,\n {\n title: 'TeamDynamix Projects Gateway',\n description: 'Gateway for TeamDynamix projects retrieval/search and project issue/risk operations.',\n inputSchema: {\n action: teamdynamixProjectsActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: false, idempotentHint: false, destructiveHint: true, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'get_project': {\n const parsed = parsePayload(z.object({ project_id: z.number().int().positive() }), payload, action);\n const project = await client.getProject(parsed.project_id);\n return toSuccessResponse(project, response_format);\n }\n case 'search_projects': {\n const parsed = parsePayload(z.object({ search: ProjectSearchSchema }), payload, action);\n const projects = await client.searchProjects(parsed.search as Record<string, unknown>);\n return toSuccessResponse({ count: projects.length, projects }, response_format);\n }\n case 'list_project_types': {\n const types = await client.listProjectTypes();\n return toSuccessResponse({ count: types.length, types }, response_format);\n }\n case 'get_project_plans': {\n const parsed = parsePayload(z.object({ project_id: z.number().int().positive() }), payload, action);\n const plans = await client.getProjectPlans(parsed.project_id);\n return toSuccessResponse({ projectId: parsed.project_id, count: plans.length, plans }, response_format);\n }\n case 'get_project_issues': {\n const parsed = parsePayload(z.object({ project_id: z.number().int().positive() }), payload, action);\n const issues = await client.getProjectIssues(parsed.project_id);\n return toSuccessResponse({ projectId: parsed.project_id, count: issues.length, issues }, response_format);\n }\n case 'get_project_risks': {\n const parsed = parsePayload(z.object({ project_id: z.number().int().positive() }), payload, action);\n const risks = await client.getProjectRisks(parsed.project_id);\n return toSuccessResponse({ projectId: parsed.project_id, count: risks.length, risks }, response_format);\n }\n case 'create_project_issue': {\n const parsed = parsePayload(\n z.object({ project_id: z.number().int().positive(), issue: ProjectIssueCreateSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const created = await client.createProjectIssue(parsed.project_id, parsed.issue as Record<string, unknown>);\n return toSuccessResponse(created, response_format);\n }\n case 'create_project_risk': {\n const parsed = parsePayload(\n z.object({ project_id: z.number().int().positive(), risk: ProjectRiskCreateSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const created = await client.createProjectRisk(parsed.project_id, parsed.risk as Record<string, unknown>);\n return toSuccessResponse(created, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixTimeGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixTimeTool,\n {\n title: 'TeamDynamix Time Gateway',\n description: 'Gateway for TeamDynamix time type lookup and authenticated user time entries.',\n inputSchema: {\n action: teamdynamixTimeActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'list_time_types': {\n const types = await client.listTimeTypes();\n return toSuccessResponse({ count: types.length, types }, response_format);\n }\n case 'get_my_time_entries': {\n const parsed = parsePayload(z.object({ query: TimeEntryQuerySchema }), payload, action);\n const entries = await client.getMyTimeEntries(parsed.query.StartDate, parsed.query.EndDate);\n return toSuccessResponse({ count: entries.length, entries }, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixReferenceDataGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixReferenceDataTool,\n {\n title: 'TeamDynamix Reference Data Gateway',\n description:\n 'Gateway for TeamDynamix reference/enumeration lookups such as accounts, locations, roles, and custom attributes.',\n inputSchema: {\n action: teamdynamixReferenceDataActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'list_accounts': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema.optional() }), payload, action);\n const accounts = await client.listAccounts(parsed.app_id);\n return toSuccessResponse({ count: accounts.length, accounts }, response_format);\n }\n case 'get_account': {\n const parsed = parsePayload(z.object({ account_id: z.number().int().positive() }), payload, action);\n const account = await client.getAccount(parsed.account_id);\n return toSuccessResponse(account, response_format);\n }\n case 'list_locations': {\n const locations = await client.listLocations();\n return toSuccessResponse({ count: locations.length, locations }, response_format);\n }\n case 'list_functional_roles': {\n const roles = await client.listFunctionalRoles();\n return toSuccessResponse({ count: roles.length, roles }, response_format);\n }\n case 'list_custom_attributes': {\n const parsed = parsePayload(\n z.object({\n component_id: CustomAttributeComponentIdSchema,\n app_id: TeamDynamixAppIdSchema.optional(),\n associated_type_id: z.number().int().positive().optional(),\n }),\n payload,\n action,\n );\n const attributes = await client.listCustomAttributes(\n parsed.component_id,\n parsed.app_id,\n parsed.associated_type_id,\n );\n return toSuccessResponse(\n { componentId: parsed.component_id, count: attributes.length, attributes },\n response_format,\n );\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n","import { z } from 'zod';\nimport { ResponseFormatSchema } from '../index.js';\n\nexport const TeamDynamixAppIdSchema = z.number().int().positive().describe('TeamDynamix application ID.');\n\nexport const TeamDynamixGuidSchema = z.string().uuid().describe('TeamDynamix GUID identifier.');\n\nexport const TeamDynamixResponseFormatSchema = ResponseFormatSchema;\n\n// ---------------------------------------------------------------------------\n// Ticket schemas\n// ---------------------------------------------------------------------------\n\nexport const TicketSearchSchema = z.object({\n Keywords: z.string().optional().describe('Full-text search term.'),\n MaxResults: z.number().int().min(1).max(1000).optional().default(50).describe('Maximum results to return (1–1000).'),\n StatusIDs: z.array(z.number().int()).optional().describe('Filter by ticket status IDs.'),\n TypeIDs: z.array(z.number().int()).optional().describe('Filter by ticket type IDs.'),\n PriorityIDs: z.array(z.number().int()).optional().describe('Filter by ticket priority IDs.'),\n UrgencyIDs: z.array(z.number().int()).optional().describe('Filter by ticket urgency IDs.'),\n ImpactIDs: z.array(z.number().int()).optional().describe('Filter by ticket impact IDs.'),\n AccountIDs: z.array(z.number().int()).optional().describe('Filter by account/department IDs.'),\n ResponsibleGroupIDs: z.array(z.number().int()).optional().describe('Filter by responsible group IDs.'),\n ResponsibleUids: z.array(z.string().uuid()).optional().describe('Filter by responsible user GUIDs.'),\n RequestorUids: z.array(z.string().uuid()).optional().describe('Filter by requestor user GUIDs.'),\n CreatedDateFrom: z.string().optional().describe('ISO 8601 start date for creation date filter.'),\n CreatedDateTo: z.string().optional().describe('ISO 8601 end date for creation date filter.'),\n ModifiedDateFrom: z.string().optional().describe('ISO 8601 start date for last-modified filter.'),\n ModifiedDateTo: z.string().optional().describe('ISO 8601 end date for last-modified filter.'),\n ClosedDateFrom: z.string().optional().describe('ISO 8601 start date for closed date filter.'),\n ClosedDateTo: z.string().optional().describe('ISO 8601 end date for closed date filter.'),\n SortBy: z.string().optional().describe('Field name to sort results by.'),\n SortOrder: z.enum(['A', 'D']).optional().describe('Sort order: A = ascending, D = descending.'),\n});\n\nexport const TicketCreateSchema = z.object({\n TypeID: z.number().int().positive().describe('Ticket type ID.'),\n Title: z.string().min(1).describe('Ticket title/subject.'),\n AccountID: z.number().int().positive().optional().describe('Account/department ID.'),\n StatusID: z.number().int().nonnegative().optional().describe('Initial ticket status ID.'),\n PriorityID: z.number().int().nonnegative().optional().describe('Ticket priority ID.'),\n UrgencyID: z.number().int().nonnegative().optional().describe('Ticket urgency ID.'),\n ImpactID: z.number().int().nonnegative().optional().describe('Ticket impact ID.'),\n SourceID: z.number().int().nonnegative().optional().describe('Ticket source ID.'),\n Description: z.string().optional().describe('Full description/body of the ticket (HTML supported).'),\n RequestorUID: z.string().uuid().optional().describe('GUID of the requestor.'),\n ResponsibleUID: z.string().uuid().optional().describe('GUID of the responsible technician.'),\n ResponsibleGroupID: z.number().int().positive().optional().describe('Responsible group ID.'),\n FormID: z.number().int().positive().optional().describe('Ticket form ID.'),\n Attributes: z\n .array(\n z.object({\n ID: z.number().int(),\n Value: z.string(),\n }),\n )\n .optional()\n .describe('Custom attribute values.'),\n});\n\nexport const TicketPatchSchema = z.object({\n TicketID: z.number().int().positive().describe('Ticket ID to update.'),\n Attributes: z\n .record(z.string(), z.string())\n .describe(\n 'Fields to update as key/value pairs. Keys must be valid ticket field names (e.g. \"StatusID\", \"Title\", \"ResponsibleUID\").',\n ),\n NotifyRequestor: z.boolean().optional().default(false).describe('Notify the requestor of the change.'),\n NotifyResponsible: z.boolean().optional().default(false).describe('Notify the responsible technician of the change.'),\n Comments: z.string().optional().describe('Comment to attach to this update.'),\n IsPrivate: z.boolean().optional().default(false).describe('Whether the comment is private.'),\n});\n\nexport const TicketCommentSchema = z.object({\n TicketID: z.number().int().positive().describe('Ticket ID to comment on.'),\n Body: z.string().min(1).describe('Comment body (HTML supported).'),\n IsPrivate: z.boolean().optional().default(false).describe('Whether this comment is private.'),\n NotifyRequestor: z.boolean().optional().default(false).describe('Notify the requestor.'),\n NotifyResponsible: z.boolean().optional().default(false).describe('Notify the responsible technician.'),\n});\n\n// ---------------------------------------------------------------------------\n// People & Groups schemas\n// ---------------------------------------------------------------------------\n\nexport const UserSearchSchema = z.object({\n SearchText: z.string().optional().describe('Name, username, or email to search for.'),\n IsActive: z.boolean().optional().describe('Filter by active (true) or inactive (false) users.'),\n IsEmployee: z.boolean().optional().describe('Filter to employees only.'),\n AppID: z.number().int().positive().optional().describe('Scope search to a specific application.'),\n MaxResults: z.number().int().min(1).max(1000).optional().default(25).describe('Maximum results (1–1000).'),\n});\n\nexport const GroupSearchSchema = z.object({\n NameLike: z.string().optional().describe('Partial group name to search.'),\n IsActive: z.boolean().optional().describe('Filter by active (true) or inactive (false) groups.'),\n AppID: z.number().int().positive().optional().describe('Scope search to a specific application.'),\n});\n\n// ---------------------------------------------------------------------------\n// Knowledge Base schemas\n// ---------------------------------------------------------------------------\n\nexport const KbArticleSearchSchema = z.object({\n SearchText: z.string().optional().describe('Full-text search within articles.'),\n CategoryID: z.number().int().positive().optional().describe('Filter by KB category ID.'),\n IsPublished: z.boolean().optional().describe('Filter to published articles only.'),\n MaxResults: z.number().int().min(1).max(500).optional().default(25).describe('Maximum results (1–500).'),\n});\n\n// ---------------------------------------------------------------------------\n// Asset / CMDB schemas\n// ---------------------------------------------------------------------------\n\nexport const AssetSearchSchema = z.object({\n SerialLike: z.string().optional().describe('Partial serial number to match.'),\n TagLike: z.string().optional().describe('Partial asset tag to match.'),\n SearchText: z.string().optional().describe('General text search across asset fields.'),\n StatusIDs: z.array(z.number().int()).optional().describe('Filter by asset status IDs.'),\n OwnerUID: z.string().uuid().optional().describe('Filter by asset owner GUID.'),\n UsingDepartmentID: z.number().int().positive().optional().describe('Filter by using department ID.'),\n MaxResults: z.number().int().min(1).max(1000).optional().default(25).describe('Maximum results (1–1000).'),\n});\n\n// ---------------------------------------------------------------------------\n// Service Catalog schemas\n// ---------------------------------------------------------------------------\n\nexport const ServiceSearchSchema = z.object({\n SearchText: z.string().optional().describe('Full-text search across service fields.'),\n IsActive: z.boolean().optional().describe('Filter to active services only.'),\n CategoryID: z.number().int().positive().optional().describe('Filter by service category ID.'),\n MaxResults: z.number().int().min(1).max(500).optional().default(25).describe('Maximum results (1–500).'),\n});\n\n// ---------------------------------------------------------------------------\n// Project schemas\n// ---------------------------------------------------------------------------\n\nexport const ProjectSearchSchema = z.object({\n NameLike: z.string().optional().describe('Partial project name to search.'),\n TypeIDs: z.array(z.number().int()).optional().describe('Filter by project type IDs.'),\n IsActive: z.boolean().optional().describe('Filter to active projects.'),\n ManagerUID: z.string().uuid().optional().describe('Filter by project manager GUID.'),\n MaxResults: z.number().int().min(1).max(500).optional().default(25).describe('Maximum results (1–500).'),\n});\n\n// ---------------------------------------------------------------------------\n// Ticket Task schemas\n// ---------------------------------------------------------------------------\n\nexport const TicketTaskCreateSchema = z.object({\n TicketID: z.number().int().positive().describe('Parent ticket ID.'),\n Title: z.string().min(1).describe('Task title.'),\n Description: z.string().optional().describe('Task description.'),\n IsActive: z.boolean().optional().default(true).describe('Whether the task is active.'),\n AssignedUID: z.string().uuid().optional().describe('GUID of the assigned user.'),\n AssignedGroupID: z.number().int().positive().optional().describe('Assigned group ID.'),\n EstimatedMinutes: z.number().int().nonnegative().optional().describe('Estimated minutes to complete.'),\n StartDate: z.string().optional().describe('Task start date (ISO 8601).'),\n EndDate: z.string().optional().describe('Task due date (ISO 8601).'),\n});\n\n// ---------------------------------------------------------------------------\n// Knowledge Base Article CRUD schemas\n// ---------------------------------------------------------------------------\n\nexport const KbArticleCreateSchema = z.object({\n Subject: z.string().min(1).describe('Article title/subject.'),\n Body: z.string().min(1).describe('Article body content (HTML supported).'),\n Summary: z.string().optional().describe('Short article summary.'),\n CategoryID: z.number().int().positive().optional().describe('KB category ID.'),\n IsPublished: z.boolean().optional().default(false).describe('Whether to publish the article immediately.'),\n Tags: z.string().optional().describe('Comma-separated tags for the article.'),\n});\n\nexport const KbArticleUpdateSchema = KbArticleCreateSchema.partial().extend({\n ArticleID: z.number().int().positive().describe('KB article ID to update.'),\n});\n\n// ---------------------------------------------------------------------------\n// CI / CMDB search schema\n// ---------------------------------------------------------------------------\n\nexport const CiSearchSchema = z.object({\n SearchText: z.string().optional().describe('Full-text search across CI fields.'),\n TypeIDs: z.array(z.number().int()).optional().describe('Filter by CI type IDs.'),\n OwnerUID: z.string().uuid().optional().describe('Filter by owner GUID.'),\n MaxResults: z.number().int().min(1).max(1000).optional().default(25).describe('Maximum results (1–1000).'),\n});\n\n// ---------------------------------------------------------------------------\n// Custom attribute component IDs (TeamDynamix constants)\n// ---------------------------------------------------------------------------\n\nexport const CustomAttributeComponentIdSchema = z\n .number()\n .int()\n .positive()\n .describe(\n 'TeamDynamix component ID for the attribute context. Common values: 9 = Ticket, 27 = Asset, 63 = KB Article, 31 = Person.',\n );\n\n// ---------------------------------------------------------------------------\n// Project subdomain schemas\n// ---------------------------------------------------------------------------\n\nexport const ProjectIssueCreateSchema = z.object({\n Title: z.string().min(1).describe('Issue title.'),\n Description: z.string().optional().describe('Issue description.'),\n AssignedUID: z.string().uuid().optional().describe('GUID of the assigned user.'),\n StatusID: z.number().int().nonnegative().optional().describe('Issue status ID.'),\n PriorityID: z.number().int().nonnegative().optional().describe('Issue priority ID.'),\n DueDate: z.string().optional().describe('Issue due date (ISO 8601).'),\n});\n\nexport const ProjectRiskCreateSchema = z.object({\n Title: z.string().min(1).describe('Risk title.'),\n Description: z.string().optional().describe('Risk description.'),\n AssignedUID: z.string().uuid().optional().describe('GUID of the risk owner.'),\n StatusID: z.number().int().nonnegative().optional().describe('Risk status ID.'),\n Probability: z.number().int().min(1).max(100).optional().describe('Probability percentage (1–100).'),\n Impact: z.number().int().min(1).max(5).optional().describe('Impact level (1 = low, 5 = critical).'),\n DueDate: z.string().optional().describe('Risk resolution due date (ISO 8601).'),\n});\n\nexport const TimeEntryQuerySchema = z.object({\n StartDate: z.string().describe('Start date for time entries query (ISO 8601 date, e.g. 2026-01-01).'),\n EndDate: z.string().describe('End date for time entries query (ISO 8601 date, e.g. 2026-01-31).'),\n});\n\n// ---------------------------------------------------------------------------\n// TeamDynamix Domain Response Schemas\n// ---------------------------------------------------------------------------\n// Runtime validation schemas for API responses. These ensure response structure\n// integrity at runtime and provide clear error messages for malformed data.\n\n/**\n * Base schema for TeamDynamix entities with flexible additional fields.\n */\nexport const TeamDynamixEntitySchema = z\n .record(z.string(), z.unknown())\n .describe('Base TeamDynamix entity with flexible additional fields');\n\n/**\n * Named entity schema (ID + Name + any other fields).\n * Used for entities like Applications, Tickets, Assets, etc.\n */\nexport const TeamDynamixNamedEntitySchema = z\n .object({\n ID: z.number().int().positive('ID must be a positive integer'),\n Name: z.string().optional(),\n })\n .catchall(z.unknown())\n .describe('TeamDynamix entity with ID and optional Name');\n\n/**\n * Application response schema.\n */\nexport const TeamDynamixApplicationSchema = TeamDynamixNamedEntitySchema.extend({\n Name: z.string().optional(),\n}).describe('TeamDynamix Application entity');\n\n/**\n * Ticket response schema.\n */\nexport const TeamDynamixTicketSchema = TeamDynamixNamedEntitySchema.extend({\n Title: z.string().optional(),\n Description: z.string().optional(),\n StatusID: z.number().int().optional(),\n TypeID: z.number().int().optional(),\n}).describe('TeamDynamix Ticket entity');\n\n/**\n * KB Article response schema.\n */\nexport const TeamDynamixKbArticleSchema = TeamDynamixNamedEntitySchema.extend({\n Subject: z.string().optional(),\n Body: z.string().optional(),\n IsPublished: z.boolean().optional(),\n}).describe('TeamDynamix Knowledge Base Article entity');\n\n/**\n * Asset response schema.\n */\nexport const TeamDynamixAssetSchema = TeamDynamixNamedEntitySchema.extend({\n Tag: z.string().optional(),\n StatusID: z.number().int().optional(),\n}).describe('TeamDynamix Asset entity');\n\n/**\n * Project response schema.\n */\nexport const TeamDynamixProjectSchema = TeamDynamixNamedEntitySchema.extend({\n Status: z.string().optional(),\n}).describe('TeamDynamix Project entity');\n\n/**\n * Group response schema.\n */\nexport const TeamDynamixGroupSchema = TeamDynamixNamedEntitySchema.extend({\n Description: z.string().optional(),\n}).describe('TeamDynamix Group entity');\n\n/**\n * User response schema.\n */\nexport const TeamDynamixUserSchema = z\n .object({\n UID: z.string({ error: 'User UID is required' }),\n FullName: z.string().optional(),\n Email: z.string().email().optional(),\n IsActive: z.boolean().optional(),\n })\n .catchall(z.unknown())\n .describe('TeamDynamix User entity');\n\n/**\n * Generic array response schema (for list/search operations).\n */\nexport const TeamDynamixListResponseSchema = z\n .array(z.record(z.string(), z.unknown()))\n .describe('Array of TeamDynamix entities');\n\n/**\n * Generic single response schema (for read/create/update operations).\n */\nexport const TeamDynamixSingleResponseSchema = z\n .record(z.string(), z.unknown())\n .describe('Single TeamDynamix entity response');\n","import { z } from 'zod';\n\nexport const ResponseFormatSchema = z\n .enum(['markdown', 'json'])\n .default('markdown')\n .describe('Output format for the response.');\n\nexport const TextTransformModeSchema = z\n .enum(['uppercase', 'lowercase', 'trim', 'slug'])\n .describe('Transformation mode to apply to the input text.');\n\n// Export TeamDynamix domain response schemas from teamdynamix subdirectory\nexport {\n TeamDynamixApplicationSchema,\n TeamDynamixAssetSchema,\n TeamDynamixEntitySchema,\n TeamDynamixGroupSchema,\n TeamDynamixKbArticleSchema,\n TeamDynamixListResponseSchema,\n TeamDynamixNamedEntitySchema,\n TeamDynamixProjectSchema,\n TeamDynamixSingleResponseSchema,\n TeamDynamixTicketSchema,\n TeamDynamixUserSchema,\n} from './teamdynamix/index.js';\n","import { LOG_LEVEL, getTeamDynamixConfig, getTeamDynamixConfigStatus } from '../../config.js';\nimport { TEAMDYNAMIX_MAX_RETRY_ATTEMPTS } from '../../constants.js';\nimport { TeamDynamixListResponseSchema, TeamDynamixSingleResponseSchema } from '../../schemas/index.js';\nimport type {\n TeamDynamixApplication,\n TeamDynamixAsset,\n TeamDynamixConfig,\n TeamDynamixEntity,\n TeamDynamixGroup,\n TeamDynamixKbArticle,\n TeamDynamixNamedEntity,\n TeamDynamixProject,\n TeamDynamixRequestOptions,\n TeamDynamixTicket,\n TeamDynamixUser,\n} from '../../types.js';\nimport { decodeJwtExpiryEpochSeconds, extractAuthToken, parseRateLimit } from './core.service.js';\n\n/**\n * Asserts that write tools are enabled in the configuration.\n * Throws a clear error if TEAMDYNAMIX_ENABLE_WRITE_TOOLS is not set to true.\n */\nexport function assertWriteToolsEnabled(config: TeamDynamixConfig): void {\n if (!config.enableWriteTools) {\n throw new Error(\n 'Write tools are disabled. Set TEAMDYNAMIX_ENABLE_WRITE_TOOLS=true in your environment to enable ticket creation, updates, comments, and other write operations.',\n );\n }\n}\n\n/**\n * Asserts that admin tools are enabled in the configuration.\n * Throws a clear error if TEAMDYNAMIX_ENABLE_ADMIN_TOOLS is not set to true.\n */\nexport function assertAdminToolsEnabled(config: TeamDynamixConfig): void {\n if (!config.enableAdminTools) {\n throw new Error(\n 'Admin tools are disabled. Set TEAMDYNAMIX_ENABLE_ADMIN_TOOLS=true in your environment and configure admin auth (BEID + WebServicesKey) to enable bulk and administrative operations.',\n );\n }\n}\n\ninterface CachedToken {\n readonly token: string;\n readonly expiresAtMs: number | null;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction normalizePath(path: string): string {\n return path.startsWith('/') ? path : `/${path}`;\n}\n\nexport class TeamDynamixClient {\n private cachedToken: CachedToken | null = null;\n\n public constructor(private readonly config: TeamDynamixConfig) {}\n\n public async getCurrentUser(): Promise<TeamDynamixUser> {\n return await this.requestJson<TeamDynamixUser>('/api/auth/getuser');\n }\n\n public async listApplications(): Promise<readonly TeamDynamixApplication[]> {\n return await this.requestJson<readonly TeamDynamixApplication[]>('/api/applications');\n }\n\n // -------------------------------------------------------------------------\n // Discovery / Enumeration domains\n // -------------------------------------------------------------------------\n\n public async listAccounts(appId?: number): Promise<readonly TeamDynamixNamedEntity[]> {\n const path = appId ? `/api/${appId}/accounts` : '/api/accounts';\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(path);\n }\n\n public async getAccount(accountId: number): Promise<TeamDynamixNamedEntity> {\n return await this.requestJson<TeamDynamixNamedEntity>(`/api/accounts/${accountId}`);\n }\n\n public async listLocations(): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>('/api/locations');\n }\n\n public async listFunctionalRoles(): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>('/api/functionalroles');\n }\n\n public async listCustomAttributes(\n componentId: number,\n appId?: number,\n associatedTypeId?: number,\n ): Promise<readonly TeamDynamixEntity[]> {\n const qs = new URLSearchParams({ componentId: String(componentId) });\n if (appId !== undefined) qs.set('appId', String(appId));\n if (associatedTypeId !== undefined) qs.set('associatedTypeId', String(associatedTypeId));\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/attributes/custom?${qs}`);\n }\n\n public async listTicketStatuses(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/tickets/statuses`);\n }\n\n public async listTicketTypes(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/tickets/types`);\n }\n\n public async listTicketPriorities(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/tickets/priorities`);\n }\n\n public async listTicketUrgencies(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/tickets/urgencies`);\n }\n\n public async listTicketImpacts(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/tickets/impacts`);\n }\n\n public async listTicketSources(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/tickets/sources`);\n }\n\n public async getTicket(appId: number, ticketId: number): Promise<TeamDynamixTicket> {\n return await this.requestJson<TeamDynamixTicket>(`/api/${appId}/tickets/${ticketId}`);\n }\n\n public async searchTickets(appId: number, body: Record<string, unknown>): Promise<readonly TeamDynamixTicket[]> {\n return await this.requestJson<readonly TeamDynamixTicket[]>(`/api/${appId}/tickets/search`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async createTicket(\n appId: number,\n body: Record<string, unknown>,\n notifyRequestor = false,\n notifyResponsible = false,\n ): Promise<TeamDynamixTicket> {\n return await this.requestJson<TeamDynamixTicket>(\n `/api/${appId}/tickets?NotifyRequestor=${notifyRequestor}&NotifyResponsible=${notifyResponsible}`,\n {\n method: 'POST',\n body: JSON.stringify(body),\n },\n );\n }\n\n public async updateTicket(\n appId: number,\n ticketId: number,\n body: Record<string, unknown>,\n notifyRequestor = false,\n notifyResponsible = false,\n comments = '',\n isPrivate = false,\n ): Promise<TeamDynamixTicket> {\n const qs = new URLSearchParams({\n NotifyRequestor: String(notifyRequestor),\n NotifyResponsible: String(notifyResponsible),\n ...(comments ? { Comments: comments } : {}),\n IsPrivate: String(isPrivate),\n });\n return await this.requestJson<TeamDynamixTicket>(`/api/${appId}/tickets/${ticketId}?${qs}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n }\n\n public async addTicketComment(\n appId: number,\n ticketId: number,\n body: string,\n isPrivate = false,\n notifyRequestor = false,\n notifyResponsible = false,\n ): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/${appId}/tickets/${ticketId}/feed`, {\n method: 'POST',\n body: JSON.stringify({\n Body: body,\n IsPrivate: isPrivate,\n NotifyRequestor: notifyRequestor,\n NotifyResponsible: notifyResponsible,\n }),\n });\n }\n\n public async getTicketFeed(appId: number, ticketId: number): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/${appId}/tickets/${ticketId}/feed`);\n }\n\n public async getTicketTasks(appId: number, ticketId: number): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/${appId}/tickets/${ticketId}/tasks`);\n }\n\n public async createTicketTask(\n appId: number,\n ticketId: number,\n body: Record<string, unknown>,\n ): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/${appId}/tickets/${ticketId}/tasks`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async listTicketAssets(appId: number, ticketId: number): Promise<readonly TeamDynamixAsset[]> {\n return await this.requestJson<readonly TeamDynamixAsset[]>(`/api/${appId}/tickets/${ticketId}/assets`);\n }\n\n public async addTicketAsset(appId: number, ticketId: number, assetId: number): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/${appId}/tickets/${ticketId}/assets/${assetId}`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n public async removeTicketAsset(appId: number, ticketId: number, assetId: number): Promise<void> {\n await this.requestJson<unknown>(`/api/${appId}/tickets/${ticketId}/assets/${assetId}`, { method: 'DELETE' });\n }\n\n // -------------------------------------------------------------------------\n // People & Groups\n // -------------------------------------------------------------------------\n\n public async getUser(uid: string): Promise<TeamDynamixUser> {\n return await this.requestJson<TeamDynamixUser>(`/api/people/${encodeURIComponent(uid)}`);\n }\n\n public async searchUsers(body: Record<string, unknown>): Promise<readonly TeamDynamixUser[]> {\n return await this.requestJson<readonly TeamDynamixUser[]>('/api/people/search', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async getGroup(groupId: number): Promise<TeamDynamixGroup> {\n return await this.requestJson<TeamDynamixGroup>(`/api/groups/${groupId}`);\n }\n\n public async searchGroups(body: Record<string, unknown>): Promise<readonly TeamDynamixGroup[]> {\n return await this.requestJson<readonly TeamDynamixGroup[]>('/api/groups/search', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async getGroupMembers(groupId: number): Promise<readonly TeamDynamixUser[]> {\n return await this.requestJson<readonly TeamDynamixUser[]>(`/api/groups/${groupId}/members`);\n }\n\n // -------------------------------------------------------------------------\n // Knowledge Base\n // -------------------------------------------------------------------------\n\n public async getKbArticle(appId: number, articleId: number): Promise<TeamDynamixKbArticle> {\n return await this.requestJson<TeamDynamixKbArticle>(`/api/${appId}/knowledgebase/${articleId}`);\n }\n\n public async searchKbArticles(\n appId: number,\n body: Record<string, unknown>,\n ): Promise<readonly TeamDynamixKbArticle[]> {\n return await this.requestJson<readonly TeamDynamixKbArticle[]>(`/api/${appId}/knowledgebase/search`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async listKbCategories(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/knowledgebase/categories`);\n }\n\n public async createKbArticle(appId: number, body: Record<string, unknown>): Promise<TeamDynamixKbArticle> {\n return await this.requestJson<TeamDynamixKbArticle>(`/api/${appId}/knowledgebase`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async updateKbArticle(\n appId: number,\n articleId: number,\n body: Record<string, unknown>,\n ): Promise<TeamDynamixKbArticle> {\n return await this.requestJson<TeamDynamixKbArticle>(`/api/${appId}/knowledgebase/${articleId}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n }\n\n // -------------------------------------------------------------------------\n // Assets / CMDB\n // -------------------------------------------------------------------------\n\n public async getAsset(appId: number, assetId: number): Promise<TeamDynamixAsset> {\n return await this.requestJson<TeamDynamixAsset>(`/api/${appId}/assets/${assetId}`);\n }\n\n public async searchAssets(appId: number, body: Record<string, unknown>): Promise<readonly TeamDynamixAsset[]> {\n return await this.requestJson<readonly TeamDynamixAsset[]>(`/api/${appId}/assets/search`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async listAssetStatuses(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/assets/statuses`);\n }\n\n public async listProductModels(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/assets/models`);\n }\n\n public async listVendors(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/assets/vendors`);\n }\n\n public async getConfigurationItem(appId: number, ciId: number): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/${appId}/cmdb/${ciId}`);\n }\n\n public async searchConfigurationItems(\n appId: number,\n body: Record<string, unknown>,\n ): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/${appId}/cmdb/search`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async listCiTypes(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/cmdb/types`);\n }\n\n public async listCiRelationshipTypes(): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>('/api/cmdb/relationshiptypes');\n }\n\n // -------------------------------------------------------------------------\n // Service Catalog\n // -------------------------------------------------------------------------\n\n public async listServiceCatalog(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/services`);\n }\n\n public async getService(appId: number, serviceId: number): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/${appId}/services/${serviceId}`);\n }\n\n public async searchServices(appId: number, body: Record<string, unknown>): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/${appId}/services/search`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n // -------------------------------------------------------------------------\n // Projects\n // -------------------------------------------------------------------------\n\n public async getProject(projectId: number): Promise<TeamDynamixProject> {\n return await this.requestJson<TeamDynamixProject>(`/api/projects/${projectId}`);\n }\n\n public async searchProjects(body: Record<string, unknown>): Promise<readonly TeamDynamixProject[]> {\n return await this.requestJson<readonly TeamDynamixProject[]>('/api/projects/search', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async listProjectTypes(): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>('/api/projects/types');\n }\n\n public async getProjectPlans(projectId: number): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/projects/${projectId}/plans`);\n }\n\n public async getProjectIssues(projectId: number): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/projects/${projectId}/issues`);\n }\n\n public async getProjectRisks(projectId: number): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/projects/${projectId}/risks`);\n }\n\n public async createProjectIssue(projectId: number, body: Record<string, unknown>): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/projects/${projectId}/issues`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async createProjectRisk(projectId: number, body: Record<string, unknown>): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/projects/${projectId}/risks`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async listTimeTypes(): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>('/api/time/types');\n }\n\n public async getMyTimeEntries(startDate: string, endDate: string): Promise<readonly TeamDynamixEntity[]> {\n const qs = new URLSearchParams({ startDate, endDate });\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/time/entries?${qs}`);\n }\n\n public async getTicketContacts(appId: number, ticketId: number): Promise<readonly TeamDynamixUser[]> {\n return await this.requestJson<readonly TeamDynamixUser[]>(`/api/${appId}/tickets/${ticketId}/contacts`);\n }\n\n public async addTicketContact(appId: number, ticketId: number, contactUid: string): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/${appId}/tickets/${ticketId}/contacts/${contactUid}`, {\n method: 'PUT',\n });\n }\n\n public async removeTicketContact(appId: number, ticketId: number, contactUid: string): Promise<void> {\n await this.requestJson<void>(`/api/${appId}/tickets/${ticketId}/contacts/${contactUid}`, {\n method: 'DELETE',\n });\n }\n\n public async listServiceCategories(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/services/categories`);\n }\n\n private async requestJson<T>(path: string, options: TeamDynamixRequestOptions = {}): Promise<T> {\n const headers = new Headers(options.headers);\n headers.set('Accept', 'application/json');\n\n if (options.body && !headers.has('Content-Type') && !(options.body instanceof FormData)) {\n headers.set('Content-Type', 'application/json');\n }\n\n const token = await this.getBearerToken(options.requireAdmin ?? false);\n headers.set('Authorization', `Bearer ${token}`);\n\n const requestInit: RequestInit = {\n method: options.method ?? 'GET',\n headers,\n body: options.body,\n };\n\n const endpoint = `${this.config.baseUrl}${normalizePath(path)}`;\n\n const cappedRetries = Math.min(this.config.maxRetries, TEAMDYNAMIX_MAX_RETRY_ATTEMPTS);\n\n for (let attempt = 0; attempt <= cappedRetries; attempt += 1) {\n const response = await fetch(endpoint, requestInit);\n\n if (response.status === 429 && attempt < cappedRetries) {\n const rateLimit = parseRateLimit(response.headers);\n if (LOG_LEVEL === 'debug') {\n console.error(\n `[teamdynamix-mcp] rate limited on ${normalizePath(path)}; retry ${attempt + 1}/${cappedRetries} in ${rateLimit.waitMs}ms`,\n );\n }\n await sleep(rateLimit.waitMs);\n continue;\n }\n\n if (!response.ok) {\n await response.text();\n throw new Error(`TeamDynamix request failed (${response.status}) for ${normalizePath(path)}.`);\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n const data = (await response.json()) as T;\n // Validate response structure at runtime\n if (Array.isArray(data)) {\n TeamDynamixListResponseSchema.parse(data);\n } else if (typeof data === 'object' && data !== null) {\n TeamDynamixSingleResponseSchema.parse(data);\n }\n return data;\n }\n\n const text = await response.text();\n return text as T;\n }\n\n throw new Error(`TeamDynamix request exceeded retry budget for ${normalizePath(path)}.`);\n }\n\n private async getBearerToken(requireAdmin: boolean): Promise<string> {\n const configStatus = getTeamDynamixConfigStatus(this.config);\n if (!configStatus.configured) {\n throw new Error(\n `TeamDynamix is not configured. Missing: ${configStatus.missing.join(', ')}. ` +\n 'Populate the required environment variables in .env before using TeamDynamix tools.',\n );\n }\n\n if (requireAdmin && this.config.authMode !== 'admin') {\n throw new Error(\n 'This TeamDynamix action requires admin authentication, but TEAMDYNAMIX_AUTH_MODE is not set to admin.',\n );\n }\n\n const expiresAtMs = this.cachedToken?.expiresAtMs;\n if (this.cachedToken && (!expiresAtMs || expiresAtMs > Date.now() + 60_000)) {\n return this.cachedToken.token;\n }\n\n const token = await this.login();\n return token;\n }\n\n private async login(): Promise<string> {\n if (!this.config.baseUrl) {\n throw new Error('TeamDynamix base URL is not configured. Set TEAMDYNAMIX_BASE_URL.');\n }\n\n const isAdmin = this.config.authMode === 'admin';\n const loginPath = isAdmin ? '/api/auth/loginadmin' : '/api/auth/login';\n const body = isAdmin\n ? JSON.stringify({ BEID: this.config.beid, WebServicesKey: this.config.webServicesKey })\n : JSON.stringify({ username: this.config.username, password: this.config.password });\n\n const response = await fetch(`${this.config.baseUrl}${loginPath}`, {\n method: 'POST',\n headers: {\n Accept: 'application/json, text/plain;q=0.9',\n 'Content-Type': 'application/json',\n },\n body,\n });\n\n if (!response.ok) {\n await response.text();\n throw new Error(`TeamDynamix authentication failed (${response.status}).`);\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n const payload = contentType.includes('application/json')\n ? ((await response.json()) as unknown)\n : await response.text();\n const token = extractAuthToken(payload);\n // TeamDynamix token expiry is derived from the JWT `exp` claim for cache invalidation.\n // Signature verification is not performed client-side because TeamDynamix validates token integrity server-side.\n const expiryEpochSeconds = decodeJwtExpiryEpochSeconds(token);\n\n this.cachedToken = {\n token,\n expiresAtMs: expiryEpochSeconds ? expiryEpochSeconds * 1_000 : null,\n };\n\n return token;\n }\n}\n\nexport function createConfiguredTeamDynamixClient(): TeamDynamixClient {\n return new TeamDynamixClient(getTeamDynamixConfig());\n}\n"],"mappings":"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","names":["McpServer","z","z","z","z","z","server","server","McpServer"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/constants.ts","../src/resources/teamdynamix.resources.ts","../src/services/teamdynamix/core.service.ts","../src/tools/teamdynamix.domain-gateways.tools.ts","../src/schemas/teamdynamix/index.ts","../src/schemas/index.ts","../src/services/teamdynamix/client.service.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { LOG_LEVEL, SERVER_NAME_OVERRIDE, SERVER_VERSION_OVERRIDE, getTeamDynamixConfig } from './config.js';\nimport { SERVER_NAME, SERVER_VERSION } from './constants.js';\nimport { registerTeamDynamixResources } from './resources/teamdynamix.resources.js';\nimport { redactTeamDynamixConfig } from './services/teamdynamix/core.service.js';\nimport { registerTeamDynamixDomainGatewayTools } from './tools/teamdynamix.domain-gateways.tools.js';\n\nconst server = new McpServer({\n name: SERVER_NAME_OVERRIDE ?? SERVER_NAME,\n version: SERVER_VERSION_OVERRIDE ?? SERVER_VERSION,\n});\n\nregisterTeamDynamixDomainGatewayTools(server);\nregisterTeamDynamixResources(server);\n\nasync function main(): Promise<void> {\n console.error(`[teamdynamix-mcp] log level: ${LOG_LEVEL}`);\n if (LOG_LEVEL === 'debug') {\n const config = getTeamDynamixConfig();\n console.error(`[teamdynamix-mcp] sanitized config: ${JSON.stringify(redactTeamDynamixConfig(config))}`);\n }\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Server startup failed: ${message}`);\n process.exit(1);\n});\n","import { z } from 'zod';\nimport {\n TEAMDYNAMIX_DEFAULT_MAX_RETRIES,\n TEAMDYNAMIX_DEFAULT_TIMEOUT_MS,\n TEAMDYNAMIX_MAX_RETRY_ATTEMPTS,\n} from './constants.js';\nimport type { TeamDynamixAuthMode, TeamDynamixConfig, TeamDynamixConfigStatus } from './types.js';\n\n/**\n * Optional server name override.\n */\nexport const SERVER_NAME_OVERRIDE: string | undefined = process.env['MCP_SERVER_NAME']?.trim() || undefined;\n\n/**\n * Optional server version override.\n */\nexport const SERVER_VERSION_OVERRIDE: string | undefined = process.env['MCP_SERVER_VERSION']?.trim() || undefined;\n\n/**\n * Runtime log level used by starter tools and resources.\n */\nconst validLogLevels = ['debug', 'info', 'warn', 'error'] as const;\ntype LogLevel = (typeof validLogLevels)[number];\nconst logLevelSchema = z.enum(validLogLevels);\nconst parsedLogLevel = logLevelSchema.safeParse(process.env['MCP_LOG_LEVEL']?.trim());\nexport const LOG_LEVEL: LogLevel = parsedLogLevel.success ? parsedLogLevel.data : 'info';\n\nfunction normalizeOptionalString(value: string | undefined): string | undefined {\n const normalized = value?.trim();\n return normalized ? normalized : undefined;\n}\n\nfunction normalizeOptionalNumber(value: string | undefined): number | undefined {\n if (!value?.trim()) {\n return undefined;\n }\n\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction normalizeBoolean(value: string | undefined, defaultValue: boolean): boolean {\n if (!value) {\n return defaultValue;\n }\n\n const normalized = value.trim().toLowerCase();\n if (normalized === 'true') return true;\n if (normalized === 'false') return false;\n return defaultValue;\n}\n\nfunction normalizeNumberWithDefault(value: string | undefined, defaultValue: number, minimum: number): number {\n if (!value?.trim()) {\n return defaultValue;\n }\n\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed >= minimum ? parsed : defaultValue;\n}\n\nfunction normalizeTeamDynamixBaseUrl(value: string | undefined): string | undefined {\n const normalized = normalizeOptionalString(value);\n return normalized ? normalized.replace(/\\/+$/, '') : undefined;\n}\n\nfunction validateHttpsBaseUrl(value: string | undefined): string | undefined {\n if (!value) return undefined;\n\n const schema = z\n .string()\n .url()\n .refine(url => url.startsWith('https://'), {\n message: 'TEAMDYNAMIX_BASE_URL must be an https URL.',\n });\n\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n throw new Error(parsed.error.issues[0]?.message ?? 'Invalid TEAMDYNAMIX_BASE_URL.');\n }\n\n return value;\n}\n\nfunction normalizeTeamDynamixAuthMode(value: string | undefined): TeamDynamixAuthMode {\n return value?.trim().toLowerCase() === 'admin' ? 'admin' : 'standard';\n}\n\nexport function getTeamDynamixConfig(): TeamDynamixConfig {\n const baseUrl = validateHttpsBaseUrl(normalizeTeamDynamixBaseUrl(process.env['TEAMDYNAMIX_BASE_URL']));\n const maxRetries = normalizeNumberWithDefault(\n process.env['TEAMDYNAMIX_MAX_RETRIES'],\n TEAMDYNAMIX_DEFAULT_MAX_RETRIES,\n 0,\n );\n if (maxRetries > 5) {\n throw new Error(`TEAMDYNAMIX_MAX_RETRIES must be between 0 and ${TEAMDYNAMIX_MAX_RETRY_ATTEMPTS}.`);\n }\n\n return {\n baseUrl,\n authMode: normalizeTeamDynamixAuthMode(process.env['TEAMDYNAMIX_AUTH_MODE']),\n username: normalizeOptionalString(process.env['TEAMDYNAMIX_USERNAME']),\n password: normalizeOptionalString(process.env['TEAMDYNAMIX_PASSWORD']),\n beid: normalizeOptionalString(process.env['TEAMDYNAMIX_BEID']),\n webServicesKey: normalizeOptionalString(process.env['TEAMDYNAMIX_WEB_SERVICES_KEY']),\n defaultTicketAppId: normalizeOptionalNumber(process.env['TEAMDYNAMIX_DEFAULT_TICKET_APP_ID']),\n defaultAssetAppId: normalizeOptionalNumber(process.env['TEAMDYNAMIX_DEFAULT_ASSET_APP_ID']),\n defaultKnowledgeBaseAppId: normalizeOptionalNumber(process.env['TEAMDYNAMIX_DEFAULT_KB_APP_ID']),\n timeoutMs: normalizeNumberWithDefault(process.env['TEAMDYNAMIX_TIMEOUT_MS'], TEAMDYNAMIX_DEFAULT_TIMEOUT_MS, 1_000),\n maxRetries,\n enableWriteTools: normalizeBoolean(process.env['TEAMDYNAMIX_ENABLE_WRITE_TOOLS'], false),\n enableAdminTools: normalizeBoolean(process.env['TEAMDYNAMIX_ENABLE_ADMIN_TOOLS'], false),\n };\n}\n\nexport function getTeamDynamixConfigStatus(\n config: TeamDynamixConfig = getTeamDynamixConfig(),\n): TeamDynamixConfigStatus {\n const missing = new Set<string>();\n\n if (!config.baseUrl) {\n missing.add('TEAMDYNAMIX_BASE_URL');\n }\n\n if (config.authMode === 'admin') {\n if (!config.beid) missing.add('TEAMDYNAMIX_BEID');\n if (!config.webServicesKey) missing.add('TEAMDYNAMIX_WEB_SERVICES_KEY');\n } else {\n if (!config.username) missing.add('TEAMDYNAMIX_USERNAME');\n if (!config.password) missing.add('TEAMDYNAMIX_PASSWORD');\n }\n\n return {\n configured: missing.size === 0,\n missing: [...missing],\n authMode: config.authMode,\n };\n}\n","export const SERVER_NAME = 'teamdynamix-mcp';\nexport const SERVER_VERSION = '0.2.0';\nexport const CHARACTER_LIMIT = 25_000;\nexport const TEAMDYNAMIX_TOOL_PREFIX = 'teamdynamix';\nexport const TEAMDYNAMIX_DEFAULT_TIMEOUT_MS = 30_000;\nexport const TEAMDYNAMIX_DEFAULT_MAX_RETRIES = 2;\nexport const TEAMDYNAMIX_MAX_RETRY_ATTEMPTS = 5;\nexport const TEAMDYNAMIX_MIN_RATE_LIMIT_WAIT_MS = 5_000;\nexport const TEAMDYNAMIX_MAX_RATE_LIMIT_WAIT_MS = 30_000;\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { getTeamDynamixConfig, getTeamDynamixConfigStatus } from '../config.js';\nimport { redactTeamDynamixConfig } from '../services/teamdynamix/core.service.js';\nimport { TEAMDYNAMIX_GATEWAY_SURFACE } from '../tools/teamdynamix.domain-gateways.tools.js';\n\nfunction stringify(data: unknown): string {\n return JSON.stringify(data, null, 2);\n}\n\nexport function registerTeamDynamixResources(server: McpServer): void {\n const resourceConfig = { list: undefined };\n\n server.registerResource(\n 'teamdynamix_capabilities',\n new ResourceTemplate('teamdynamix://capabilities', resourceConfig),\n {\n title: 'TeamDynamix Capabilities',\n description: 'Read-only snapshot of the currently implemented TeamDynamix MCP surface.',\n mimeType: 'application/json',\n },\n async uri => {\n const capabilities = {\n toolGroups: {\n discovery: [TEAMDYNAMIX_GATEWAY_SURFACE.discovery.tool],\n tickets: [TEAMDYNAMIX_GATEWAY_SURFACE.tickets.tool],\n ticket_relationships: [TEAMDYNAMIX_GATEWAY_SURFACE.ticketRelationships.tool],\n people: [TEAMDYNAMIX_GATEWAY_SURFACE.people.tool],\n knowledge_base: [TEAMDYNAMIX_GATEWAY_SURFACE.knowledgeBase.tool],\n assets: [TEAMDYNAMIX_GATEWAY_SURFACE.assets.tool],\n cmdb: [TEAMDYNAMIX_GATEWAY_SURFACE.cmdb.tool],\n services: [TEAMDYNAMIX_GATEWAY_SURFACE.services.tool],\n projects: [TEAMDYNAMIX_GATEWAY_SURFACE.projects.tool],\n time: [TEAMDYNAMIX_GATEWAY_SURFACE.time.tool],\n reference_data: [TEAMDYNAMIX_GATEWAY_SURFACE.referenceData.tool],\n },\n gatewayActions: {\n discovery: TEAMDYNAMIX_GATEWAY_SURFACE.discovery.actions,\n tickets: TEAMDYNAMIX_GATEWAY_SURFACE.tickets.actions,\n ticket_relationships: TEAMDYNAMIX_GATEWAY_SURFACE.ticketRelationships.actions,\n people: TEAMDYNAMIX_GATEWAY_SURFACE.people.actions,\n knowledge_base: TEAMDYNAMIX_GATEWAY_SURFACE.knowledgeBase.actions,\n assets: TEAMDYNAMIX_GATEWAY_SURFACE.assets.actions,\n cmdb: TEAMDYNAMIX_GATEWAY_SURFACE.cmdb.actions,\n services: TEAMDYNAMIX_GATEWAY_SURFACE.services.actions,\n projects: TEAMDYNAMIX_GATEWAY_SURFACE.projects.actions,\n time: TEAMDYNAMIX_GATEWAY_SURFACE.time.actions,\n reference_data: TEAMDYNAMIX_GATEWAY_SURFACE.referenceData.actions,\n },\n implementedDomains: [\n 'discovery',\n 'tickets',\n 'ticket_relationships',\n 'people',\n 'knowledge_base',\n 'assets',\n 'cmdb',\n 'services',\n 'projects',\n 'time',\n 'reference_data',\n ],\n };\n\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify(capabilities) }],\n };\n },\n );\n\n server.registerResource(\n 'teamdynamix_config',\n new ResourceTemplate('teamdynamix://config', resourceConfig),\n {\n title: 'TeamDynamix Runtime Config',\n description: 'Read-only sanitized TeamDynamix configuration and readiness metadata.',\n mimeType: 'application/json',\n },\n async uri => {\n const runtimeConfig = getTeamDynamixConfig();\n const config = {\n status: getTeamDynamixConfigStatus(runtimeConfig),\n config: redactTeamDynamixConfig(runtimeConfig),\n };\n\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify(config) }],\n };\n },\n );\n}\n","import { TEAMDYNAMIX_MAX_RATE_LIMIT_WAIT_MS, TEAMDYNAMIX_MIN_RATE_LIMIT_WAIT_MS } from '../../constants.js';\nimport type { TeamDynamixConfig, TeamDynamixJsonPatchOperation, TeamDynamixRateLimit } from '../../types.js';\n\nfunction normalizePatchPath(path: string): string {\n const withLeadingSlash = path.startsWith('/') ? path : `/${path}`;\n const segments = withLeadingSlash.split('/');\n return segments\n .map((segment, index) => {\n if (index === 0 || segment.length === 0) {\n return segment;\n }\n\n return /^\\d+$/.test(segment) ? segment : segment.toLowerCase();\n })\n .join('/');\n}\n\nexport function buildTeamDynamixJsonPatchDocument(\n operations: readonly TeamDynamixJsonPatchOperation[],\n): readonly TeamDynamixJsonPatchOperation[] {\n return operations.map(operation => {\n if (operation.op === 'remove') {\n return {\n op: operation.op,\n path: normalizePatchPath(operation.path),\n };\n }\n\n return {\n op: operation.op,\n path: normalizePatchPath(operation.path),\n value: operation.value ?? null,\n };\n });\n}\n\nexport function toTeamDynamixDateTime(value: Date | string): string {\n const date = value instanceof Date ? value : new Date(value);\n if (!Number.isFinite(date.getTime())) {\n throw new TypeError(`Invalid date value: \"${String(value)}\"`);\n }\n return date.toISOString();\n}\n\nexport function toTeamDynamixDateOnly(value: Date | string): string {\n const date = value instanceof Date ? value : new Date(value);\n if (!Number.isFinite(date.getTime())) {\n throw new TypeError(`Invalid date value: \"${String(value)}\"`);\n }\n return date.toISOString().slice(0, 10);\n}\n\nexport function parseRateLimit(headers: Headers, nowMs = Date.now()): TeamDynamixRateLimit {\n const limitRaw = headers.get('X-RateLimit-Limit');\n const remainingRaw = headers.get('X-RateLimit-Remaining');\n const resetRaw = headers.get('X-RateLimit-Reset');\n const resetTime = resetRaw ? Date.parse(resetRaw) : Number.NaN;\n const computedWaitMs = Number.isFinite(resetTime) ? resetTime - nowMs : TEAMDYNAMIX_MIN_RATE_LIMIT_WAIT_MS;\n const waitMs = Math.min(\n Math.max(\n Number.isFinite(computedWaitMs) ? computedWaitMs : TEAMDYNAMIX_MIN_RATE_LIMIT_WAIT_MS,\n TEAMDYNAMIX_MIN_RATE_LIMIT_WAIT_MS,\n ),\n TEAMDYNAMIX_MAX_RATE_LIMIT_WAIT_MS,\n );\n\n return {\n limit: limitRaw ? Number.parseInt(limitRaw, 10) : null,\n remaining: remainingRaw ? Number.parseInt(remainingRaw, 10) : null,\n resetAt: Number.isFinite(resetTime) ? new Date(resetTime).toISOString() : null,\n waitMs,\n };\n}\n\nexport function redactTeamDynamixConfig(config: TeamDynamixConfig): Record<string, unknown> {\n return {\n baseUrl: config.baseUrl ?? null,\n authMode: config.authMode,\n username: config.username ? '[configured]' : null,\n password: config.password ? '[configured]' : null,\n beid: config.beid ? '[configured]' : null,\n webServicesKey: config.webServicesKey ? '[configured]' : null,\n defaultTicketAppId: config.defaultTicketAppId ?? null,\n defaultAssetAppId: config.defaultAssetAppId ?? null,\n defaultKnowledgeBaseAppId: config.defaultKnowledgeBaseAppId ?? null,\n timeoutMs: config.timeoutMs,\n maxRetries: config.maxRetries,\n enableWriteTools: config.enableWriteTools,\n enableAdminTools: config.enableAdminTools,\n };\n}\n\nexport function decodeJwtExpiryEpochSeconds(token: string): number | null {\n const segments = token.split('.');\n const payload = segments[1];\n if (!payload) {\n return null;\n }\n\n try {\n const normalized = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padding = normalized.length % 4 === 0 ? '' : '='.repeat(4 - (normalized.length % 4));\n const decoded = Buffer.from(`${normalized}${padding}`, 'base64').toString('utf8');\n const parsed = JSON.parse(decoded) as { exp?: unknown };\n return typeof parsed.exp === 'number' ? parsed.exp : null;\n } catch {\n return null;\n }\n}\n\nexport function extractAuthToken(payload: unknown): string {\n if (typeof payload === 'string' && payload.trim()) {\n return payload.trim();\n }\n\n if (!payload || typeof payload !== 'object') {\n throw new Error('Unable to extract bearer token from TeamDynamix authentication response.');\n }\n\n const record = payload as Record<string, unknown>;\n const candidateKeys = ['token', 'Token', 'accessToken', 'AccessToken', 'bearerToken', 'TokenText', 'value'];\n for (const key of candidateKeys) {\n const candidate = record[key];\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n throw new Error('Unable to extract bearer token from TeamDynamix authentication response.');\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { getTeamDynamixConfig, getTeamDynamixConfigStatus } from '../config.js';\nimport { TEAMDYNAMIX_TOOL_PREFIX } from '../constants.js';\nimport {\n AssetSearchSchema,\n CiSearchSchema,\n CustomAttributeComponentIdSchema,\n GroupSearchSchema,\n KbArticleCreateSchema,\n KbArticleSearchSchema,\n KbArticleUpdateSchema,\n ProjectIssueCreateSchema,\n ProjectRiskCreateSchema,\n ProjectSearchSchema,\n ServiceSearchSchema,\n TeamDynamixAppIdSchema,\n TeamDynamixGuidSchema,\n TeamDynamixResponseFormatSchema,\n TicketCommentSchema,\n TicketCreateSchema,\n TicketPatchSchema,\n TicketSearchSchema,\n TicketTaskCreateSchema,\n TimeEntryQuerySchema,\n UserSearchSchema,\n} from '../schemas/teamdynamix/index.js';\nimport { assertWriteToolsEnabled, createConfiguredTeamDynamixClient } from '../services/teamdynamix/client.service.js';\nimport { redactTeamDynamixConfig } from '../services/teamdynamix/core.service.js';\nimport type { ResponseFormat } from '../types.js';\n\nconst teamdynamixDiscoveryActionSchema = z.enum([\n 'server_status',\n 'get_current_user',\n 'list_applications',\n 'list_ticket_statuses',\n]);\n\nconst teamdynamixTicketActionSchema = z.enum([\n 'list_ticket_types',\n 'list_ticket_priorities',\n 'list_ticket_urgencies',\n 'list_ticket_impacts',\n 'list_ticket_sources',\n 'get_ticket',\n 'search_tickets',\n 'create_ticket',\n 'update_ticket',\n 'add_ticket_comment',\n 'get_ticket_feed',\n]);\n\nconst teamdynamixTicketRelationshipActionSchema = z.enum([\n 'get_ticket_tasks',\n 'create_ticket_task',\n 'list_ticket_assets',\n 'add_ticket_asset',\n 'remove_ticket_asset',\n 'get_ticket_contacts',\n 'add_ticket_contact',\n 'remove_ticket_contact',\n]);\n\nconst teamdynamixPeopleActionSchema = z.enum([\n 'get_user',\n 'search_users',\n 'get_group',\n 'search_groups',\n 'get_group_members',\n]);\n\nconst teamdynamixKnowledgeBaseActionSchema = z.enum([\n 'get_kb_article',\n 'search_kb_articles',\n 'list_kb_categories',\n 'create_kb_article',\n 'update_kb_article',\n]);\n\nconst teamdynamixAssetsActionSchema = z.enum([\n 'get_asset',\n 'search_assets',\n 'list_asset_statuses',\n 'list_product_models',\n]);\n\nconst teamdynamixCmdbActionSchema = z.enum([\n 'get_ci',\n 'search_cis',\n 'list_ci_types',\n 'list_ci_relationship_types',\n 'list_vendors',\n]);\n\nconst teamdynamixServicesActionSchema = z.enum([\n 'list_services',\n 'get_service',\n 'search_services',\n 'list_service_categories',\n]);\n\nconst teamdynamixProjectsActionSchema = z.enum([\n 'get_project',\n 'search_projects',\n 'list_project_types',\n 'get_project_plans',\n 'get_project_issues',\n 'get_project_risks',\n 'create_project_issue',\n 'create_project_risk',\n]);\n\nconst teamdynamixTimeActionSchema = z.enum(['list_time_types', 'get_my_time_entries']);\n\nconst teamdynamixReferenceDataActionSchema = z.enum([\n 'list_accounts',\n 'get_account',\n 'list_locations',\n 'list_functional_roles',\n 'list_custom_attributes',\n]);\n\nconst gatewayPayloadSchema = z.record(z.string(), z.unknown()).default({});\n\nfunction render(data: unknown, responseFormat: ResponseFormat): string {\n if (responseFormat === 'json') return JSON.stringify(data, null, 2);\n if (typeof data === 'string') return data;\n return JSON.stringify(data, null, 2);\n}\n\nfunction messageFromError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toStructuredContent(payload: unknown): Record<string, unknown> {\n if (typeof payload === 'object' && payload !== null && !Array.isArray(payload)) {\n return payload as Record<string, unknown>;\n }\n\n return {\n data: payload,\n };\n}\n\nfunction parsePayload<TSchema extends z.ZodTypeAny>(\n schema: TSchema,\n payload: Record<string, unknown>,\n action: string,\n): z.infer<TSchema> {\n const parsed = schema.safeParse(payload);\n if (!parsed.success) {\n const details = parsed.error.issues\n .map(issue => `${issue.path.join('.') || '<root>'}: ${issue.message}`)\n .join('; ');\n throw new Error(`Invalid payload for action \"${action}\": ${details}`);\n }\n return parsed.data;\n}\n\nfunction toSuccessResponse(payload: unknown, responseFormat: ResponseFormat) {\n return {\n content: [{ type: 'text' as const, text: render(payload, responseFormat) }],\n structuredContent: toStructuredContent(payload),\n };\n}\n\nfunction toErrorResponse(error: unknown) {\n const message = messageFromError(error);\n\n return {\n content: [{ type: 'text' as const, text: `Error: ${message}` }],\n structuredContent: {\n ok: false,\n kind: 'unknown',\n message,\n },\n isError: true,\n };\n}\n\nconst teamdynamixDiscoveryTool = `${TEAMDYNAMIX_TOOL_PREFIX}_discovery`;\nconst teamdynamixTicketsTool = `${TEAMDYNAMIX_TOOL_PREFIX}_tickets`;\nconst teamdynamixTicketRelationshipsTool = `${TEAMDYNAMIX_TOOL_PREFIX}_ticket_relationships`;\nconst teamdynamixPeopleTool = `${TEAMDYNAMIX_TOOL_PREFIX}_people`;\nconst teamdynamixKnowledgeBaseTool = `${TEAMDYNAMIX_TOOL_PREFIX}_knowledge_base`;\nconst teamdynamixAssetsTool = `${TEAMDYNAMIX_TOOL_PREFIX}_assets`;\nconst teamdynamixCmdbTool = `${TEAMDYNAMIX_TOOL_PREFIX}_cmdb`;\nconst teamdynamixServicesTool = `${TEAMDYNAMIX_TOOL_PREFIX}_services`;\nconst teamdynamixProjectsTool = `${TEAMDYNAMIX_TOOL_PREFIX}_projects`;\nconst teamdynamixTimeTool = `${TEAMDYNAMIX_TOOL_PREFIX}_time`;\nconst teamdynamixReferenceDataTool = `${TEAMDYNAMIX_TOOL_PREFIX}_reference_data`;\n\nexport const TEAMDYNAMIX_GATEWAY_SURFACE = {\n discovery: {\n tool: teamdynamixDiscoveryTool,\n actions: teamdynamixDiscoveryActionSchema.options,\n },\n tickets: {\n tool: teamdynamixTicketsTool,\n actions: teamdynamixTicketActionSchema.options,\n },\n ticketRelationships: {\n tool: teamdynamixTicketRelationshipsTool,\n actions: teamdynamixTicketRelationshipActionSchema.options,\n },\n people: {\n tool: teamdynamixPeopleTool,\n actions: teamdynamixPeopleActionSchema.options,\n },\n knowledgeBase: {\n tool: teamdynamixKnowledgeBaseTool,\n actions: teamdynamixKnowledgeBaseActionSchema.options,\n },\n assets: {\n tool: teamdynamixAssetsTool,\n actions: teamdynamixAssetsActionSchema.options,\n },\n cmdb: {\n tool: teamdynamixCmdbTool,\n actions: teamdynamixCmdbActionSchema.options,\n },\n services: {\n tool: teamdynamixServicesTool,\n actions: teamdynamixServicesActionSchema.options,\n },\n projects: {\n tool: teamdynamixProjectsTool,\n actions: teamdynamixProjectsActionSchema.options,\n },\n time: {\n tool: teamdynamixTimeTool,\n actions: teamdynamixTimeActionSchema.options,\n },\n referenceData: {\n tool: teamdynamixReferenceDataTool,\n actions: teamdynamixReferenceDataActionSchema.options,\n },\n} as const;\n\nexport function registerTeamDynamixDomainGatewayTools(server: McpServer): void {\n registerTeamDynamixDiscoveryGateway(server);\n registerTeamDynamixTicketsGateway(server);\n registerTeamDynamixTicketRelationshipsGateway(server);\n registerTeamDynamixPeopleGateway(server);\n registerTeamDynamixKnowledgeBaseGateway(server);\n registerTeamDynamixAssetsGateway(server);\n registerTeamDynamixCmdbGateway(server);\n registerTeamDynamixServicesGateway(server);\n registerTeamDynamixProjectsGateway(server);\n registerTeamDynamixTimeGateway(server);\n registerTeamDynamixReferenceDataGateway(server);\n}\n\nfunction registerTeamDynamixDiscoveryGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixDiscoveryTool,\n {\n title: 'TeamDynamix Discovery Gateway',\n description:\n 'Gateway for discovery operations: server status, current user, applications, and ticket status lookup.',\n inputSchema: {\n action: teamdynamixDiscoveryActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'server_status': {\n const config = getTeamDynamixConfig();\n const status = getTeamDynamixConfigStatus(config);\n const result = {\n status,\n config: redactTeamDynamixConfig(config),\n gateway: 'discovery',\n actions: TEAMDYNAMIX_GATEWAY_SURFACE.discovery.actions,\n };\n return toSuccessResponse(result, response_format);\n }\n case 'get_current_user': {\n const user = await client.getCurrentUser();\n return toSuccessResponse(user, response_format);\n }\n case 'list_applications': {\n const applications = await client.listApplications();\n return toSuccessResponse({ count: applications.length, applications }, response_format);\n }\n case 'list_ticket_statuses': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema.optional() }), payload, action);\n const config = getTeamDynamixConfig();\n const effectiveAppId = parsed.app_id ?? config.defaultTicketAppId;\n if (!effectiveAppId) {\n throw new Error(\n 'No TeamDynamix ticket application ID was provided. Supply payload.app_id or configure TEAMDYNAMIX_DEFAULT_TICKET_APP_ID.',\n );\n }\n const statuses = await client.listTicketStatuses(effectiveAppId);\n return toSuccessResponse({ appId: effectiveAppId, count: statuses.length, statuses }, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixTicketsGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixTicketsTool,\n {\n title: 'TeamDynamix Tickets Gateway',\n description: 'Gateway for ticket metadata, read/search, create/update, comments, and feed operations.',\n inputSchema: {\n action: teamdynamixTicketActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: false, idempotentHint: false, destructiveHint: true, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'list_ticket_types': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const types = await client.listTicketTypes(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, types }, response_format);\n }\n case 'list_ticket_priorities': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const priorities = await client.listTicketPriorities(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, priorities }, response_format);\n }\n case 'list_ticket_urgencies': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const urgencies = await client.listTicketUrgencies(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, urgencies }, response_format);\n }\n case 'list_ticket_impacts': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const impacts = await client.listTicketImpacts(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, impacts }, response_format);\n }\n case 'list_ticket_sources': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const sources = await client.listTicketSources(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, sources }, response_format);\n }\n case 'get_ticket': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, ticket_id: z.number().int().positive() }),\n payload,\n action,\n );\n const ticket = await client.getTicket(parsed.app_id, parsed.ticket_id);\n return toSuccessResponse(ticket, response_format);\n }\n case 'search_tickets': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, search: TicketSearchSchema }),\n payload,\n action,\n );\n const tickets = await client.searchTickets(parsed.app_id, parsed.search as Record<string, unknown>);\n return toSuccessResponse({ appId: parsed.app_id, count: tickets.length, tickets }, response_format);\n }\n case 'create_ticket': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n ticket: TicketCreateSchema,\n notify_requestor: z.boolean().optional().default(false),\n notify_responsible: z.boolean().optional().default(false),\n }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const created = await client.createTicket(\n parsed.app_id,\n parsed.ticket as Record<string, unknown>,\n parsed.notify_requestor,\n parsed.notify_responsible,\n );\n return toSuccessResponse(created, response_format);\n }\n case 'update_ticket': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, patch: TicketPatchSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const updated = await client.updateTicket(\n parsed.app_id,\n parsed.patch.TicketID,\n parsed.patch.Attributes as Record<string, unknown>,\n parsed.patch.NotifyRequestor ?? false,\n parsed.patch.NotifyResponsible ?? false,\n parsed.patch.Comments ?? '',\n parsed.patch.IsPrivate ?? false,\n );\n return toSuccessResponse(updated, response_format);\n }\n case 'add_ticket_comment': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, comment: TicketCommentSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const entry = await client.addTicketComment(\n parsed.app_id,\n parsed.comment.TicketID,\n parsed.comment.Body,\n parsed.comment.IsPrivate ?? false,\n parsed.comment.NotifyRequestor ?? false,\n parsed.comment.NotifyResponsible ?? false,\n );\n return toSuccessResponse(entry, response_format);\n }\n case 'get_ticket_feed': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, ticket_id: z.number().int().positive() }),\n payload,\n action,\n );\n const feed = await client.getTicketFeed(parsed.app_id, parsed.ticket_id);\n return toSuccessResponse(\n { appId: parsed.app_id, ticketId: parsed.ticket_id, entries: feed },\n response_format,\n );\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixTicketRelationshipsGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixTicketRelationshipsTool,\n {\n title: 'TeamDynamix Ticket Relationships Gateway',\n description: 'Gateway for ticket tasks, linked assets, and linked contacts operations.',\n inputSchema: {\n action: teamdynamixTicketRelationshipActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: false, idempotentHint: false, destructiveHint: true, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'get_ticket_tasks': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, ticket_id: z.number().int().positive() }),\n payload,\n action,\n );\n const tasks = await client.getTicketTasks(parsed.app_id, parsed.ticket_id);\n return toSuccessResponse(\n { appId: parsed.app_id, ticketId: parsed.ticket_id, count: tasks.length, tasks },\n response_format,\n );\n }\n case 'create_ticket_task': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, task: TicketTaskCreateSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const created = await client.createTicketTask(\n parsed.app_id,\n parsed.task.TicketID,\n parsed.task as Record<string, unknown>,\n );\n return toSuccessResponse(created, response_format);\n }\n case 'list_ticket_assets': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, ticket_id: z.number().int().positive() }),\n payload,\n action,\n );\n const assets = await client.listTicketAssets(parsed.app_id, parsed.ticket_id);\n return toSuccessResponse(\n { appId: parsed.app_id, ticketId: parsed.ticket_id, count: assets.length, assets },\n response_format,\n );\n }\n case 'add_ticket_asset': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n ticket_id: z.number().int().positive(),\n asset_id: z.number().int().positive(),\n }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const result = await client.addTicketAsset(parsed.app_id, parsed.ticket_id, parsed.asset_id);\n return toSuccessResponse(result, response_format);\n }\n case 'remove_ticket_asset': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n ticket_id: z.number().int().positive(),\n asset_id: z.number().int().positive(),\n confirm: z.literal(true),\n }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n await client.removeTicketAsset(parsed.app_id, parsed.ticket_id, parsed.asset_id);\n return toSuccessResponse(\n {\n appId: parsed.app_id,\n ticketId: parsed.ticket_id,\n assetId: parsed.asset_id,\n unlinked: true,\n },\n response_format,\n );\n }\n case 'get_ticket_contacts': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, ticket_id: z.number().int().positive() }),\n payload,\n action,\n );\n const contacts = await client.getTicketContacts(parsed.app_id, parsed.ticket_id);\n return toSuccessResponse(\n { appId: parsed.app_id, ticketId: parsed.ticket_id, count: contacts.length, contacts },\n response_format,\n );\n }\n case 'add_ticket_contact': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n ticket_id: z.number().int().positive(),\n contact_uid: TeamDynamixGuidSchema,\n }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const result = await client.addTicketContact(parsed.app_id, parsed.ticket_id, parsed.contact_uid);\n return toSuccessResponse(result, response_format);\n }\n case 'remove_ticket_contact': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n ticket_id: z.number().int().positive(),\n contact_uid: TeamDynamixGuidSchema,\n confirm: z.literal(true),\n }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n await client.removeTicketContact(parsed.app_id, parsed.ticket_id, parsed.contact_uid);\n return toSuccessResponse(\n {\n appId: parsed.app_id,\n ticketId: parsed.ticket_id,\n contactUid: parsed.contact_uid,\n removed: true,\n },\n response_format,\n );\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixPeopleGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixPeopleTool,\n {\n title: 'TeamDynamix People Gateway',\n description: 'Gateway for user and group retrieval/search operations.',\n inputSchema: {\n action: teamdynamixPeopleActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'get_user': {\n const parsed = parsePayload(z.object({ uid: TeamDynamixGuidSchema }), payload, action);\n const user = await client.getUser(parsed.uid);\n return toSuccessResponse(user, response_format);\n }\n case 'search_users': {\n const parsed = parsePayload(z.object({ search: UserSearchSchema }), payload, action);\n const users = await client.searchUsers(parsed.search as Record<string, unknown>);\n return toSuccessResponse({ count: users.length, users }, response_format);\n }\n case 'get_group': {\n const parsed = parsePayload(z.object({ group_id: z.number().int().positive() }), payload, action);\n const group = await client.getGroup(parsed.group_id);\n return toSuccessResponse(group, response_format);\n }\n case 'search_groups': {\n const parsed = parsePayload(z.object({ search: GroupSearchSchema }), payload, action);\n const groups = await client.searchGroups(parsed.search as Record<string, unknown>);\n return toSuccessResponse({ count: groups.length, groups }, response_format);\n }\n case 'get_group_members': {\n const parsed = parsePayload(z.object({ group_id: z.number().int().positive() }), payload, action);\n const members = await client.getGroupMembers(parsed.group_id);\n return toSuccessResponse({ groupId: parsed.group_id, count: members.length, members }, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixKnowledgeBaseGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixKnowledgeBaseTool,\n {\n title: 'TeamDynamix Knowledge Base Gateway',\n description: 'Gateway for TeamDynamix Knowledge Base retrieval, search, and write operations.',\n inputSchema: {\n action: teamdynamixKnowledgeBaseActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: false, idempotentHint: false, destructiveHint: true, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'get_kb_article': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, article_id: z.number().int().positive() }),\n payload,\n action,\n );\n const article = await client.getKbArticle(parsed.app_id, parsed.article_id);\n return toSuccessResponse(article, response_format);\n }\n case 'search_kb_articles': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, search: KbArticleSearchSchema }),\n payload,\n action,\n );\n const articles = await client.searchKbArticles(parsed.app_id, parsed.search as Record<string, unknown>);\n return toSuccessResponse({ appId: parsed.app_id, count: articles.length, articles }, response_format);\n }\n case 'list_kb_categories': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const categories = await client.listKbCategories(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: categories.length, categories }, response_format);\n }\n case 'create_kb_article': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, article: KbArticleCreateSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const created = await client.createKbArticle(parsed.app_id, parsed.article as Record<string, unknown>);\n return toSuccessResponse(created, response_format);\n }\n case 'update_kb_article': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, article: KbArticleUpdateSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const { ArticleID, ...body } = parsed.article;\n const updated = await client.updateKbArticle(parsed.app_id, ArticleID, body as Record<string, unknown>);\n return toSuccessResponse(updated, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixAssetsGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixAssetsTool,\n {\n title: 'TeamDynamix Assets Gateway',\n description: 'Gateway for TeamDynamix asset retrieval, search, and lookup enumerations.',\n inputSchema: {\n action: teamdynamixAssetsActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'get_asset': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, asset_id: z.number().int().positive() }),\n payload,\n action,\n );\n const asset = await client.getAsset(parsed.app_id, parsed.asset_id);\n return toSuccessResponse(asset, response_format);\n }\n case 'search_assets': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, search: AssetSearchSchema }),\n payload,\n action,\n );\n const assets = await client.searchAssets(parsed.app_id, parsed.search as Record<string, unknown>);\n return toSuccessResponse({ appId: parsed.app_id, count: assets.length, assets }, response_format);\n }\n case 'list_asset_statuses': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const statuses = await client.listAssetStatuses(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: statuses.length, statuses }, response_format);\n }\n case 'list_product_models': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const models = await client.listProductModels(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: models.length, models }, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixCmdbGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixCmdbTool,\n {\n title: 'TeamDynamix CMDB Gateway',\n description: 'Gateway for CI/CMDB retrieval, search, types, relationship types, and vendors.',\n inputSchema: {\n action: teamdynamixCmdbActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'get_ci': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, ci_id: z.number().int().positive() }),\n payload,\n action,\n );\n const ci = await client.getConfigurationItem(parsed.app_id, parsed.ci_id);\n return toSuccessResponse(ci, response_format);\n }\n case 'search_cis': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, search: CiSearchSchema }),\n payload,\n action,\n );\n const results = await client.searchConfigurationItems(\n parsed.app_id,\n parsed.search as Record<string, unknown>,\n );\n return toSuccessResponse({ appId: parsed.app_id, count: results.length, results }, response_format);\n }\n case 'list_ci_types': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const types = await client.listCiTypes(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: types.length, types }, response_format);\n }\n case 'list_ci_relationship_types': {\n const types = await client.listCiRelationshipTypes();\n return toSuccessResponse({ count: types.length, types }, response_format);\n }\n case 'list_vendors': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const vendors = await client.listVendors(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: vendors.length, vendors }, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixServicesGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixServicesTool,\n {\n title: 'TeamDynamix Services Gateway',\n description: 'Gateway for TeamDynamix service catalog list/get/search/category operations.',\n inputSchema: {\n action: teamdynamixServicesActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'list_services': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const services = await client.listServiceCatalog(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: services.length, services }, response_format);\n }\n case 'get_service': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, service_id: z.number().int().positive() }),\n payload,\n action,\n );\n const service = await client.getService(parsed.app_id, parsed.service_id);\n return toSuccessResponse(service, response_format);\n }\n case 'search_services': {\n const parsed = parsePayload(\n z.object({ app_id: TeamDynamixAppIdSchema, search: ServiceSearchSchema }),\n payload,\n action,\n );\n const services = await client.searchServices(parsed.app_id, parsed.search as Record<string, unknown>);\n return toSuccessResponse({ appId: parsed.app_id, count: services.length, services }, response_format);\n }\n case 'list_service_categories': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema }), payload, action);\n const categories = await client.listServiceCategories(parsed.app_id);\n return toSuccessResponse({ appId: parsed.app_id, count: categories.length, categories }, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixProjectsGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixProjectsTool,\n {\n title: 'TeamDynamix Projects Gateway',\n description: 'Gateway for TeamDynamix projects retrieval/search and project issue/risk operations.',\n inputSchema: {\n action: teamdynamixProjectsActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: false, idempotentHint: false, destructiveHint: true, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'get_project': {\n const parsed = parsePayload(z.object({ project_id: z.number().int().positive() }), payload, action);\n const project = await client.getProject(parsed.project_id);\n return toSuccessResponse(project, response_format);\n }\n case 'search_projects': {\n const parsed = parsePayload(z.object({ search: ProjectSearchSchema }), payload, action);\n const projects = await client.searchProjects(parsed.search as Record<string, unknown>);\n return toSuccessResponse({ count: projects.length, projects }, response_format);\n }\n case 'list_project_types': {\n const types = await client.listProjectTypes();\n return toSuccessResponse({ count: types.length, types }, response_format);\n }\n case 'get_project_plans': {\n const parsed = parsePayload(z.object({ project_id: z.number().int().positive() }), payload, action);\n const plans = await client.getProjectPlans(parsed.project_id);\n return toSuccessResponse({ projectId: parsed.project_id, count: plans.length, plans }, response_format);\n }\n case 'get_project_issues': {\n const parsed = parsePayload(z.object({ project_id: z.number().int().positive() }), payload, action);\n const issues = await client.getProjectIssues(parsed.project_id);\n return toSuccessResponse({ projectId: parsed.project_id, count: issues.length, issues }, response_format);\n }\n case 'get_project_risks': {\n const parsed = parsePayload(z.object({ project_id: z.number().int().positive() }), payload, action);\n const risks = await client.getProjectRisks(parsed.project_id);\n return toSuccessResponse({ projectId: parsed.project_id, count: risks.length, risks }, response_format);\n }\n case 'create_project_issue': {\n const parsed = parsePayload(\n z.object({ project_id: z.number().int().positive(), issue: ProjectIssueCreateSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const created = await client.createProjectIssue(parsed.project_id, parsed.issue as Record<string, unknown>);\n return toSuccessResponse(created, response_format);\n }\n case 'create_project_risk': {\n const parsed = parsePayload(\n z.object({ project_id: z.number().int().positive(), risk: ProjectRiskCreateSchema }),\n payload,\n action,\n );\n assertWriteToolsEnabled(getTeamDynamixConfig());\n const created = await client.createProjectRisk(parsed.project_id, parsed.risk as Record<string, unknown>);\n return toSuccessResponse(created, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixTimeGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixTimeTool,\n {\n title: 'TeamDynamix Time Gateway',\n description: 'Gateway for TeamDynamix time type lookup and authenticated user time entries.',\n inputSchema: {\n action: teamdynamixTimeActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'list_time_types': {\n const types = await client.listTimeTypes();\n return toSuccessResponse({ count: types.length, types }, response_format);\n }\n case 'get_my_time_entries': {\n const parsed = parsePayload(z.object({ query: TimeEntryQuerySchema }), payload, action);\n const entries = await client.getMyTimeEntries(parsed.query.StartDate, parsed.query.EndDate);\n return toSuccessResponse({ count: entries.length, entries }, response_format);\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n\nfunction registerTeamDynamixReferenceDataGateway(server: McpServer): void {\n server.registerTool(\n teamdynamixReferenceDataTool,\n {\n title: 'TeamDynamix Reference Data Gateway',\n description:\n 'Gateway for TeamDynamix reference/enumeration lookups such as accounts, locations, roles, and custom attributes.',\n inputSchema: {\n action: teamdynamixReferenceDataActionSchema,\n payload: gatewayPayloadSchema,\n response_format: TeamDynamixResponseFormatSchema,\n },\n annotations: { readOnlyHint: true, idempotentHint: false, destructiveHint: false, openWorldHint: true },\n },\n async ({ action, payload, response_format }) => {\n try {\n const client = createConfiguredTeamDynamixClient();\n\n switch (action) {\n case 'list_accounts': {\n const parsed = parsePayload(z.object({ app_id: TeamDynamixAppIdSchema.optional() }), payload, action);\n const accounts = await client.listAccounts(parsed.app_id);\n return toSuccessResponse({ count: accounts.length, accounts }, response_format);\n }\n case 'get_account': {\n const parsed = parsePayload(z.object({ account_id: z.number().int().positive() }), payload, action);\n const account = await client.getAccount(parsed.account_id);\n return toSuccessResponse(account, response_format);\n }\n case 'list_locations': {\n const locations = await client.listLocations();\n return toSuccessResponse({ count: locations.length, locations }, response_format);\n }\n case 'list_functional_roles': {\n const roles = await client.listFunctionalRoles();\n return toSuccessResponse({ count: roles.length, roles }, response_format);\n }\n case 'list_custom_attributes': {\n const parsed = parsePayload(\n z.object({\n component_id: CustomAttributeComponentIdSchema,\n app_id: TeamDynamixAppIdSchema.optional(),\n associated_type_id: z.number().int().positive().optional(),\n }),\n payload,\n action,\n );\n const attributes = await client.listCustomAttributes(\n parsed.component_id,\n parsed.app_id,\n parsed.associated_type_id,\n );\n return toSuccessResponse(\n { componentId: parsed.component_id, count: attributes.length, attributes },\n response_format,\n );\n }\n }\n } catch (error) {\n return toErrorResponse(error);\n }\n },\n );\n}\n","import { z } from 'zod';\nimport { ResponseFormatSchema } from '../index.js';\n\nexport const TeamDynamixAppIdSchema = z.number().int().positive().describe('TeamDynamix application ID.');\n\n/**\n * Shared ISO-8601 date/datetime schema.\n * Accepts `YYYY-MM-DD` (date only) or `YYYY-MM-DDTHH:mm`, `YYYY-MM-DDTHH:mm:ss`,\n * `YYYY-MM-DDTHH:mm:ss.sss` with an optional timezone (`Z`, `+HH:MM`, `-HH:MM`).\n * Rejects free-form strings such as `\"tomorrow\"` or `\"2026-01-01T++++\"`.\n */\nexport const IsoDateSchema = z\n .string()\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$/,\n 'Must be a valid ISO 8601 date string.',\n );\n\nexport const TeamDynamixGuidSchema = z.string().uuid().describe('TeamDynamix GUID identifier.');\n\nexport const TeamDynamixResponseFormatSchema = ResponseFormatSchema;\n\n// ---------------------------------------------------------------------------\n// Ticket schemas\n// ---------------------------------------------------------------------------\n\nexport const TicketSearchSchema = z.object({\n Keywords: z.string().max(500).optional().describe('Full-text search term.'),\n MaxResults: z.number().int().min(1).max(1000).optional().default(50).describe('Maximum results to return (1–1000).'),\n StatusIDs: z.array(z.number().int()).optional().describe('Filter by ticket status IDs.'),\n TypeIDs: z.array(z.number().int()).optional().describe('Filter by ticket type IDs.'),\n PriorityIDs: z.array(z.number().int()).optional().describe('Filter by ticket priority IDs.'),\n UrgencyIDs: z.array(z.number().int()).optional().describe('Filter by ticket urgency IDs.'),\n ImpactIDs: z.array(z.number().int()).optional().describe('Filter by ticket impact IDs.'),\n AccountIDs: z.array(z.number().int()).optional().describe('Filter by account/department IDs.'),\n ResponsibleGroupIDs: z.array(z.number().int()).optional().describe('Filter by responsible group IDs.'),\n ResponsibleUids: z.array(z.string().uuid()).optional().describe('Filter by responsible user GUIDs.'),\n RequestorUids: z.array(z.string().uuid()).optional().describe('Filter by requestor user GUIDs.'),\n CreatedDateFrom: IsoDateSchema.optional().describe('ISO 8601 start date for creation date filter.'),\n CreatedDateTo: IsoDateSchema.optional().describe('ISO 8601 end date for creation date filter.'),\n ModifiedDateFrom: IsoDateSchema.optional().describe('ISO 8601 start date for last-modified filter.'),\n ModifiedDateTo: IsoDateSchema.optional().describe('ISO 8601 end date for last-modified filter.'),\n ClosedDateFrom: IsoDateSchema.optional().describe('ISO 8601 start date for closed date filter.'),\n ClosedDateTo: IsoDateSchema.optional().describe('ISO 8601 end date for closed date filter.'),\n SortBy: z.string().max(100).optional().describe('Field name to sort results by.'),\n SortOrder: z.enum(['A', 'D']).optional().describe('Sort order: A = ascending, D = descending.'),\n});\n\nexport const TicketCreateSchema = z.object({\n TypeID: z.number().int().positive().describe('Ticket type ID.'),\n Title: z.string().min(1).max(500).describe('Ticket title/subject.'),\n AccountID: z.number().int().positive().optional().describe('Account/department ID.'),\n StatusID: z.number().int().nonnegative().optional().describe('Initial ticket status ID.'),\n PriorityID: z.number().int().nonnegative().optional().describe('Ticket priority ID.'),\n UrgencyID: z.number().int().nonnegative().optional().describe('Ticket urgency ID.'),\n ImpactID: z.number().int().nonnegative().optional().describe('Ticket impact ID.'),\n SourceID: z.number().int().nonnegative().optional().describe('Ticket source ID.'),\n Description: z.string().max(65535).optional().describe('Full description/body of the ticket (HTML supported).'),\n RequestorUID: z.string().uuid().optional().describe('GUID of the requestor.'),\n ResponsibleUID: z.string().uuid().optional().describe('GUID of the responsible technician.'),\n ResponsibleGroupID: z.number().int().positive().optional().describe('Responsible group ID.'),\n FormID: z.number().int().positive().optional().describe('Ticket form ID.'),\n Attributes: z\n .array(\n z.object({\n ID: z.number().int(),\n Value: z.string(),\n }),\n )\n .optional()\n .describe('Custom attribute values.'),\n});\n\nexport const TicketPatchSchema = z.object({\n TicketID: z.number().int().positive().describe('Ticket ID to update.'),\n Attributes: z\n .record(z.string().max(100), z.string().max(65535))\n .refine(obj => Object.keys(obj).length <= 50, { message: 'Attributes may contain at most 50 fields per update.' })\n .describe(\n 'Fields to update as key/value pairs. Keys must be valid ticket field names (e.g. \"StatusID\", \"Title\", \"ResponsibleUID\"). Maximum 50 fields per update.',\n ),\n NotifyRequestor: z.boolean().optional().default(false).describe('Notify the requestor of the change.'),\n NotifyResponsible: z.boolean().optional().default(false).describe('Notify the responsible technician of the change.'),\n Comments: z.string().max(65535).optional().describe('Comment to attach to this update.'),\n IsPrivate: z.boolean().optional().default(false).describe('Whether the comment is private.'),\n});\n\nexport const TicketCommentSchema = z.object({\n TicketID: z.number().int().positive().describe('Ticket ID to comment on.'),\n Body: z.string().min(1).max(65535).describe('Comment body (HTML supported).'),\n IsPrivate: z.boolean().optional().default(false).describe('Whether this comment is private.'),\n NotifyRequestor: z.boolean().optional().default(false).describe('Notify the requestor.'),\n NotifyResponsible: z.boolean().optional().default(false).describe('Notify the responsible technician.'),\n});\n\n// ---------------------------------------------------------------------------\n// People & Groups schemas\n// ---------------------------------------------------------------------------\n\nexport const UserSearchSchema = z.object({\n SearchText: z.string().max(500).optional().describe('Name, username, or email to search for.'),\n IsActive: z.boolean().optional().describe('Filter by active (true) or inactive (false) users.'),\n IsEmployee: z.boolean().optional().describe('Filter to employees only.'),\n AppID: z.number().int().positive().optional().describe('Scope search to a specific application.'),\n MaxResults: z.number().int().min(1).max(1000).optional().default(25).describe('Maximum results (1–1000).'),\n});\n\nexport const GroupSearchSchema = z.object({\n NameLike: z.string().max(500).optional().describe('Partial group name to search.'),\n IsActive: z.boolean().optional().describe('Filter by active (true) or inactive (false) groups.'),\n AppID: z.number().int().positive().optional().describe('Scope search to a specific application.'),\n});\n\n// ---------------------------------------------------------------------------\n// Knowledge Base schemas\n// ---------------------------------------------------------------------------\n\nexport const KbArticleSearchSchema = z.object({\n SearchText: z.string().max(500).optional().describe('Full-text search within articles.'),\n CategoryID: z.number().int().positive().optional().describe('Filter by KB category ID.'),\n IsPublished: z.boolean().optional().describe('Filter to published articles only.'),\n MaxResults: z.number().int().min(1).max(500).optional().default(25).describe('Maximum results (1–500).'),\n});\n\n// ---------------------------------------------------------------------------\n// Asset / CMDB schemas\n// ---------------------------------------------------------------------------\n\nexport const AssetSearchSchema = z.object({\n SerialLike: z.string().max(200).optional().describe('Partial serial number to match.'),\n TagLike: z.string().max(200).optional().describe('Partial asset tag to match.'),\n SearchText: z.string().max(500).optional().describe('General text search across asset fields.'),\n StatusIDs: z.array(z.number().int()).optional().describe('Filter by asset status IDs.'),\n OwnerUID: z.string().uuid().optional().describe('Filter by asset owner GUID.'),\n UsingDepartmentID: z.number().int().positive().optional().describe('Filter by using department ID.'),\n MaxResults: z.number().int().min(1).max(1000).optional().default(25).describe('Maximum results (1–1000).'),\n});\n\n// ---------------------------------------------------------------------------\n// Service Catalog schemas\n// ---------------------------------------------------------------------------\n\nexport const ServiceSearchSchema = z.object({\n SearchText: z.string().max(500).optional().describe('Full-text search across service fields.'),\n IsActive: z.boolean().optional().describe('Filter to active services only.'),\n CategoryID: z.number().int().positive().optional().describe('Filter by service category ID.'),\n MaxResults: z.number().int().min(1).max(500).optional().default(25).describe('Maximum results (1–500).'),\n});\n\n// ---------------------------------------------------------------------------\n// Project schemas\n// ---------------------------------------------------------------------------\n\nexport const ProjectSearchSchema = z.object({\n NameLike: z.string().max(500).optional().describe('Partial project name to search.'),\n TypeIDs: z.array(z.number().int()).optional().describe('Filter by project type IDs.'),\n IsActive: z.boolean().optional().describe('Filter to active projects.'),\n ManagerUID: z.string().uuid().optional().describe('Filter by project manager GUID.'),\n MaxResults: z.number().int().min(1).max(500).optional().default(25).describe('Maximum results (1–500).'),\n});\n\n// ---------------------------------------------------------------------------\n// Ticket Task schemas\n// ---------------------------------------------------------------------------\n\nexport const TicketTaskCreateSchema = z.object({\n TicketID: z.number().int().positive().describe('Parent ticket ID.'),\n Title: z.string().min(1).max(500).describe('Task title.'),\n Description: z.string().max(65535).optional().describe('Task description.'),\n IsActive: z.boolean().optional().default(true).describe('Whether the task is active.'),\n AssignedUID: z.string().uuid().optional().describe('GUID of the assigned user.'),\n AssignedGroupID: z.number().int().positive().optional().describe('Assigned group ID.'),\n EstimatedMinutes: z.number().int().nonnegative().optional().describe('Estimated minutes to complete.'),\n StartDate: IsoDateSchema.optional().describe('Task start date (ISO 8601).'),\n EndDate: IsoDateSchema.optional().describe('Task due date (ISO 8601).'),\n});\n\n// ---------------------------------------------------------------------------\n// Knowledge Base Article CRUD schemas\n// ---------------------------------------------------------------------------\n\nexport const KbArticleCreateSchema = z.object({\n Subject: z.string().min(1).max(500).describe('Article title/subject.'),\n Body: z.string().min(1).max(500000).describe('Article body content (HTML supported).'),\n Summary: z.string().max(2000).optional().describe('Short article summary.'),\n CategoryID: z.number().int().positive().optional().describe('KB category ID.'),\n IsPublished: z.boolean().optional().default(false).describe('Whether to publish the article immediately.'),\n Tags: z.string().max(1000).optional().describe('Comma-separated tags for the article.'),\n});\n\nexport const KbArticleUpdateSchema = KbArticleCreateSchema.partial().extend({\n ArticleID: z.number().int().positive().describe('KB article ID to update.'),\n});\n\n// ---------------------------------------------------------------------------\n// CI / CMDB search schema\n// ---------------------------------------------------------------------------\n\nexport const CiSearchSchema = z.object({\n SearchText: z.string().max(500).optional().describe('Full-text search across CI fields.'),\n TypeIDs: z.array(z.number().int()).optional().describe('Filter by CI type IDs.'),\n OwnerUID: z.string().uuid().optional().describe('Filter by owner GUID.'),\n MaxResults: z.number().int().min(1).max(1000).optional().default(25).describe('Maximum results (1–1000).'),\n});\n\n// ---------------------------------------------------------------------------\n// Custom attribute component IDs (TeamDynamix constants)\n// ---------------------------------------------------------------------------\n\nexport const CustomAttributeComponentIdSchema = z\n .number()\n .int()\n .positive()\n .describe(\n 'TeamDynamix component ID for the attribute context. Common values: 9 = Ticket, 27 = Asset, 63 = KB Article, 31 = Person.',\n );\n\n// ---------------------------------------------------------------------------\n// Project subdomain schemas\n// ---------------------------------------------------------------------------\n\nexport const ProjectIssueCreateSchema = z.object({\n Title: z.string().min(1).max(500).describe('Issue title.'),\n Description: z.string().max(65535).optional().describe('Issue description.'),\n AssignedUID: z.string().uuid().optional().describe('GUID of the assigned user.'),\n StatusID: z.number().int().nonnegative().optional().describe('Issue status ID.'),\n PriorityID: z.number().int().nonnegative().optional().describe('Issue priority ID.'),\n DueDate: IsoDateSchema.optional().describe('Issue due date (ISO 8601).'),\n});\n\nexport const ProjectRiskCreateSchema = z.object({\n Title: z.string().min(1).max(500).describe('Risk title.'),\n Description: z.string().max(65535).optional().describe('Risk description.'),\n AssignedUID: z.string().uuid().optional().describe('GUID of the risk owner.'),\n StatusID: z.number().int().nonnegative().optional().describe('Risk status ID.'),\n Probability: z.number().int().min(1).max(100).optional().describe('Probability percentage (1–100).'),\n Impact: z.number().int().min(1).max(5).optional().describe('Impact level (1 = low, 5 = critical).'),\n DueDate: IsoDateSchema.optional().describe('Risk resolution due date (ISO 8601).'),\n});\n\nexport const TimeEntryQuerySchema = z.object({\n StartDate: IsoDateSchema.describe('Start date for time entries query (ISO 8601 date, e.g. 2026-01-01).'),\n EndDate: IsoDateSchema.describe('End date for time entries query (ISO 8601 date, e.g. 2026-01-31).'),\n});\n\n// ---------------------------------------------------------------------------\n// TeamDynamix Domain Response Schemas\n// ---------------------------------------------------------------------------\n// Runtime validation schemas for API responses. These ensure response structure\n// integrity at runtime and provide clear error messages for malformed data.\n\n/**\n * Base schema for TeamDynamix entities with flexible additional fields.\n */\nexport const TeamDynamixEntitySchema = z\n .record(z.string(), z.unknown())\n .describe('Base TeamDynamix entity with flexible additional fields');\n\n/**\n * Named entity schema (ID + Name + any other fields).\n * Used for entities like Applications, Tickets, Assets, etc.\n */\nexport const TeamDynamixNamedEntitySchema = z\n .object({\n ID: z.number().int().positive('ID must be a positive integer'),\n Name: z.string().optional(),\n })\n .catchall(z.unknown())\n .describe('TeamDynamix entity with ID and optional Name');\n\n/**\n * Application response schema.\n */\nexport const TeamDynamixApplicationSchema = TeamDynamixNamedEntitySchema.extend({\n Name: z.string().optional(),\n}).describe('TeamDynamix Application entity');\n\n/**\n * Ticket response schema.\n */\nexport const TeamDynamixTicketSchema = TeamDynamixNamedEntitySchema.extend({\n Title: z.string().optional(),\n Description: z.string().optional(),\n StatusID: z.number().int().optional(),\n TypeID: z.number().int().optional(),\n}).describe('TeamDynamix Ticket entity');\n\n/**\n * KB Article response schema.\n */\nexport const TeamDynamixKbArticleSchema = TeamDynamixNamedEntitySchema.extend({\n Subject: z.string().optional(),\n Body: z.string().optional(),\n IsPublished: z.boolean().optional(),\n}).describe('TeamDynamix Knowledge Base Article entity');\n\n/**\n * Asset response schema.\n */\nexport const TeamDynamixAssetSchema = TeamDynamixNamedEntitySchema.extend({\n Tag: z.string().optional(),\n StatusID: z.number().int().optional(),\n}).describe('TeamDynamix Asset entity');\n\n/**\n * Project response schema.\n */\nexport const TeamDynamixProjectSchema = TeamDynamixNamedEntitySchema.extend({\n Status: z.string().optional(),\n}).describe('TeamDynamix Project entity');\n\n/**\n * Group response schema.\n */\nexport const TeamDynamixGroupSchema = TeamDynamixNamedEntitySchema.extend({\n Description: z.string().optional(),\n}).describe('TeamDynamix Group entity');\n\n/**\n * User response schema.\n */\nexport const TeamDynamixUserSchema = z\n .object({\n UID: z.string({ error: 'User UID is required' }),\n FullName: z.string().optional(),\n Email: z.string().email().optional(),\n IsActive: z.boolean().optional(),\n })\n .catchall(z.unknown())\n .describe('TeamDynamix User entity');\n\n/**\n * Generic array response schema (for list/search operations).\n */\nexport const TeamDynamixListResponseSchema = z\n .array(z.record(z.string(), z.unknown()))\n .describe('Array of TeamDynamix entities');\n\n/**\n * Generic single response schema (for read/create/update operations).\n */\nexport const TeamDynamixSingleResponseSchema = z\n .record(z.string(), z.unknown())\n .describe('Single TeamDynamix entity response');\n","import { z } from 'zod';\n\nexport const ResponseFormatSchema = z\n .enum(['markdown', 'json'])\n .default('markdown')\n .describe('Output format for the response.');\n\nexport const TextTransformModeSchema = z\n .enum(['uppercase', 'lowercase', 'trim', 'slug'])\n .describe('Transformation mode to apply to the input text.');\n\n// Export TeamDynamix domain response schemas from teamdynamix subdirectory\nexport {\n TeamDynamixApplicationSchema,\n TeamDynamixAssetSchema,\n TeamDynamixEntitySchema,\n TeamDynamixGroupSchema,\n TeamDynamixKbArticleSchema,\n TeamDynamixListResponseSchema,\n TeamDynamixNamedEntitySchema,\n TeamDynamixProjectSchema,\n TeamDynamixSingleResponseSchema,\n TeamDynamixTicketSchema,\n TeamDynamixUserSchema,\n} from './teamdynamix/index.js';\n","import { LOG_LEVEL, getTeamDynamixConfig, getTeamDynamixConfigStatus } from '../../config.js';\nimport { TEAMDYNAMIX_MAX_RETRY_ATTEMPTS } from '../../constants.js';\nimport { TeamDynamixListResponseSchema, TeamDynamixSingleResponseSchema } from '../../schemas/index.js';\nimport type {\n TeamDynamixApplication,\n TeamDynamixAsset,\n TeamDynamixConfig,\n TeamDynamixEntity,\n TeamDynamixGroup,\n TeamDynamixKbArticle,\n TeamDynamixNamedEntity,\n TeamDynamixProject,\n TeamDynamixRequestOptions,\n TeamDynamixTicket,\n TeamDynamixUser,\n} from '../../types.js';\nimport { decodeJwtExpiryEpochSeconds, extractAuthToken, parseRateLimit } from './core.service.js';\n\n/**\n * Asserts that write tools are enabled in the configuration.\n * Throws a clear error if TEAMDYNAMIX_ENABLE_WRITE_TOOLS is not set to true.\n */\nexport function assertWriteToolsEnabled(config: TeamDynamixConfig): void {\n if (!config.enableWriteTools) {\n throw new Error(\n 'Write tools are disabled. Set TEAMDYNAMIX_ENABLE_WRITE_TOOLS=true in your environment to enable ticket creation, updates, comments, and other write operations.',\n );\n }\n}\n\n/**\n * Asserts that admin tools are enabled in the configuration.\n * Throws a clear error if TEAMDYNAMIX_ENABLE_ADMIN_TOOLS is not set to true.\n */\nexport function assertAdminToolsEnabled(config: TeamDynamixConfig): void {\n if (!config.enableAdminTools) {\n throw new Error(\n 'Admin tools are disabled. Set TEAMDYNAMIX_ENABLE_ADMIN_TOOLS=true in your environment and configure admin auth (BEID + WebServicesKey) to enable bulk and administrative operations.',\n );\n }\n}\n\ninterface CachedToken {\n readonly token: string;\n readonly expiresAtMs: number | null;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction normalizePath(path: string): string {\n return path.startsWith('/') ? path : `/${path}`;\n}\n\n// Proactive token-bucket rate limiter — 2 req/sec sustained, burst of 20.\n// Prevents hitting server-side 429s in normal operation.\nclass TokenBucket {\n private tokens: number;\n private lastRefillMs: number;\n\n constructor(\n private readonly capacity: number,\n private readonly refillRatePerMs: number,\n ) {\n this.tokens = capacity;\n this.lastRefillMs = Date.now();\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefillMs;\n this.tokens = Math.min(this.capacity, this.tokens + elapsed * this.refillRatePerMs);\n this.lastRefillMs = now;\n }\n\n async acquire(): Promise<void> {\n this.refill();\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return;\n }\n const waitMs = Math.ceil((1 - this.tokens) / this.refillRatePerMs);\n await sleep(waitMs);\n return this.acquire();\n }\n}\n\nconst sharedRateLimiter = new TokenBucket(20, 2 / 1000);\n\nexport class TeamDynamixClient {\n private cachedToken: CachedToken | null = null;\n\n public constructor(\n private readonly config: TeamDynamixConfig,\n private readonly rateLimiter: TokenBucket = sharedRateLimiter,\n ) {}\n\n public async getCurrentUser(): Promise<TeamDynamixUser> {\n return await this.requestJson<TeamDynamixUser>('/api/auth/getuser');\n }\n\n public async listApplications(): Promise<readonly TeamDynamixApplication[]> {\n return await this.requestJson<readonly TeamDynamixApplication[]>('/api/applications');\n }\n\n // -------------------------------------------------------------------------\n // Discovery / Enumeration domains\n // -------------------------------------------------------------------------\n\n public async listAccounts(appId?: number): Promise<readonly TeamDynamixNamedEntity[]> {\n const path = appId ? `/api/${appId}/accounts` : '/api/accounts';\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(path);\n }\n\n public async getAccount(accountId: number): Promise<TeamDynamixNamedEntity> {\n return await this.requestJson<TeamDynamixNamedEntity>(`/api/accounts/${accountId}`);\n }\n\n public async listLocations(): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>('/api/locations');\n }\n\n public async listFunctionalRoles(): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>('/api/functionalroles');\n }\n\n public async listCustomAttributes(\n componentId: number,\n appId?: number,\n associatedTypeId?: number,\n ): Promise<readonly TeamDynamixEntity[]> {\n const qs = new URLSearchParams({ componentId: String(componentId) });\n if (appId !== undefined) qs.set('appId', String(appId));\n if (associatedTypeId !== undefined) qs.set('associatedTypeId', String(associatedTypeId));\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/attributes/custom?${qs}`);\n }\n\n public async listTicketStatuses(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/tickets/statuses`);\n }\n\n public async listTicketTypes(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/tickets/types`);\n }\n\n public async listTicketPriorities(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/tickets/priorities`);\n }\n\n public async listTicketUrgencies(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/tickets/urgencies`);\n }\n\n public async listTicketImpacts(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/tickets/impacts`);\n }\n\n public async listTicketSources(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/tickets/sources`);\n }\n\n public async getTicket(appId: number, ticketId: number): Promise<TeamDynamixTicket> {\n return await this.requestJson<TeamDynamixTicket>(`/api/${appId}/tickets/${ticketId}`);\n }\n\n public async searchTickets(appId: number, body: Record<string, unknown>): Promise<readonly TeamDynamixTicket[]> {\n return await this.requestJson<readonly TeamDynamixTicket[]>(`/api/${appId}/tickets/search`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async createTicket(\n appId: number,\n body: Record<string, unknown>,\n notifyRequestor = false,\n notifyResponsible = false,\n ): Promise<TeamDynamixTicket> {\n const qs = new URLSearchParams({\n NotifyRequestor: String(notifyRequestor),\n NotifyResponsible: String(notifyResponsible),\n });\n return await this.requestJson<TeamDynamixTicket>(`/api/${appId}/tickets?${qs}`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async updateTicket(\n appId: number,\n ticketId: number,\n body: Record<string, unknown>,\n notifyRequestor = false,\n notifyResponsible = false,\n comments = '',\n isPrivate = false,\n ): Promise<TeamDynamixTicket> {\n const qs = new URLSearchParams({\n NotifyRequestor: String(notifyRequestor),\n NotifyResponsible: String(notifyResponsible),\n ...(comments ? { Comments: comments } : {}),\n IsPrivate: String(isPrivate),\n });\n return await this.requestJson<TeamDynamixTicket>(`/api/${appId}/tickets/${ticketId}?${qs}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n }\n\n public async addTicketComment(\n appId: number,\n ticketId: number,\n body: string,\n isPrivate = false,\n notifyRequestor = false,\n notifyResponsible = false,\n ): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/${appId}/tickets/${ticketId}/feed`, {\n method: 'POST',\n body: JSON.stringify({\n Body: body,\n IsPrivate: isPrivate,\n NotifyRequestor: notifyRequestor,\n NotifyResponsible: notifyResponsible,\n }),\n });\n }\n\n public async getTicketFeed(appId: number, ticketId: number): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/${appId}/tickets/${ticketId}/feed`);\n }\n\n public async getTicketTasks(appId: number, ticketId: number): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/${appId}/tickets/${ticketId}/tasks`);\n }\n\n public async createTicketTask(\n appId: number,\n ticketId: number,\n body: Record<string, unknown>,\n ): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/${appId}/tickets/${ticketId}/tasks`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async listTicketAssets(appId: number, ticketId: number): Promise<readonly TeamDynamixAsset[]> {\n return await this.requestJson<readonly TeamDynamixAsset[]>(`/api/${appId}/tickets/${ticketId}/assets`);\n }\n\n public async addTicketAsset(appId: number, ticketId: number, assetId: number): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/${appId}/tickets/${ticketId}/assets/${assetId}`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n public async removeTicketAsset(appId: number, ticketId: number, assetId: number): Promise<void> {\n await this.requestJson<void>(`/api/${appId}/tickets/${ticketId}/assets/${assetId}`, { method: 'DELETE' });\n }\n\n // -------------------------------------------------------------------------\n // People & Groups\n // -------------------------------------------------------------------------\n\n public async getUser(uid: string): Promise<TeamDynamixUser> {\n return await this.requestJson<TeamDynamixUser>(`/api/people/${encodeURIComponent(uid)}`);\n }\n\n public async searchUsers(body: Record<string, unknown>): Promise<readonly TeamDynamixUser[]> {\n return await this.requestJson<readonly TeamDynamixUser[]>('/api/people/search', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async getGroup(groupId: number): Promise<TeamDynamixGroup> {\n return await this.requestJson<TeamDynamixGroup>(`/api/groups/${groupId}`);\n }\n\n public async searchGroups(body: Record<string, unknown>): Promise<readonly TeamDynamixGroup[]> {\n return await this.requestJson<readonly TeamDynamixGroup[]>('/api/groups/search', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async getGroupMembers(groupId: number): Promise<readonly TeamDynamixUser[]> {\n return await this.requestJson<readonly TeamDynamixUser[]>(`/api/groups/${groupId}/members`);\n }\n\n // -------------------------------------------------------------------------\n // Knowledge Base\n // -------------------------------------------------------------------------\n\n public async getKbArticle(appId: number, articleId: number): Promise<TeamDynamixKbArticle> {\n return await this.requestJson<TeamDynamixKbArticle>(`/api/${appId}/knowledgebase/${articleId}`);\n }\n\n public async searchKbArticles(\n appId: number,\n body: Record<string, unknown>,\n ): Promise<readonly TeamDynamixKbArticle[]> {\n return await this.requestJson<readonly TeamDynamixKbArticle[]>(`/api/${appId}/knowledgebase/search`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async listKbCategories(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/knowledgebase/categories`);\n }\n\n public async createKbArticle(appId: number, body: Record<string, unknown>): Promise<TeamDynamixKbArticle> {\n return await this.requestJson<TeamDynamixKbArticle>(`/api/${appId}/knowledgebase`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async updateKbArticle(\n appId: number,\n articleId: number,\n body: Record<string, unknown>,\n ): Promise<TeamDynamixKbArticle> {\n return await this.requestJson<TeamDynamixKbArticle>(`/api/${appId}/knowledgebase/${articleId}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n }\n\n // -------------------------------------------------------------------------\n // Assets / CMDB\n // -------------------------------------------------------------------------\n\n public async getAsset(appId: number, assetId: number): Promise<TeamDynamixAsset> {\n return await this.requestJson<TeamDynamixAsset>(`/api/${appId}/assets/${assetId}`);\n }\n\n public async searchAssets(appId: number, body: Record<string, unknown>): Promise<readonly TeamDynamixAsset[]> {\n return await this.requestJson<readonly TeamDynamixAsset[]>(`/api/${appId}/assets/search`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async listAssetStatuses(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/assets/statuses`);\n }\n\n public async listProductModels(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/assets/models`);\n }\n\n public async listVendors(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/assets/vendors`);\n }\n\n public async getConfigurationItem(appId: number, ciId: number): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/${appId}/cmdb/${ciId}`);\n }\n\n public async searchConfigurationItems(\n appId: number,\n body: Record<string, unknown>,\n ): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/${appId}/cmdb/search`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async listCiTypes(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/cmdb/types`);\n }\n\n public async listCiRelationshipTypes(): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>('/api/cmdb/relationshiptypes');\n }\n\n // -------------------------------------------------------------------------\n // Service Catalog\n // -------------------------------------------------------------------------\n\n public async listServiceCatalog(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/services`);\n }\n\n public async getService(appId: number, serviceId: number): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/${appId}/services/${serviceId}`);\n }\n\n public async searchServices(appId: number, body: Record<string, unknown>): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/${appId}/services/search`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n // -------------------------------------------------------------------------\n // Projects\n // -------------------------------------------------------------------------\n\n public async getProject(projectId: number): Promise<TeamDynamixProject> {\n return await this.requestJson<TeamDynamixProject>(`/api/projects/${projectId}`);\n }\n\n public async searchProjects(body: Record<string, unknown>): Promise<readonly TeamDynamixProject[]> {\n return await this.requestJson<readonly TeamDynamixProject[]>('/api/projects/search', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async listProjectTypes(): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>('/api/projects/types');\n }\n\n public async getProjectPlans(projectId: number): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/projects/${projectId}/plans`);\n }\n\n public async getProjectIssues(projectId: number): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/projects/${projectId}/issues`);\n }\n\n public async getProjectRisks(projectId: number): Promise<readonly TeamDynamixEntity[]> {\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/projects/${projectId}/risks`);\n }\n\n public async createProjectIssue(projectId: number, body: Record<string, unknown>): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/projects/${projectId}/issues`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async createProjectRisk(projectId: number, body: Record<string, unknown>): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/projects/${projectId}/risks`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n public async listTimeTypes(): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>('/api/time/types');\n }\n\n public async getMyTimeEntries(startDate: string, endDate: string): Promise<readonly TeamDynamixEntity[]> {\n const qs = new URLSearchParams({ startDate, endDate });\n return await this.requestJson<readonly TeamDynamixEntity[]>(`/api/time/entries?${qs}`);\n }\n\n public async getTicketContacts(appId: number, ticketId: number): Promise<readonly TeamDynamixUser[]> {\n return await this.requestJson<readonly TeamDynamixUser[]>(`/api/${appId}/tickets/${ticketId}/contacts`);\n }\n\n public async addTicketContact(appId: number, ticketId: number, contactUid: string): Promise<TeamDynamixEntity> {\n return await this.requestJson<TeamDynamixEntity>(`/api/${appId}/tickets/${ticketId}/contacts/${contactUid}`, {\n method: 'PUT',\n });\n }\n\n public async removeTicketContact(appId: number, ticketId: number, contactUid: string): Promise<void> {\n await this.requestJson<void>(`/api/${appId}/tickets/${ticketId}/contacts/${contactUid}`, {\n method: 'DELETE',\n });\n }\n\n public async listServiceCategories(appId: number): Promise<readonly TeamDynamixNamedEntity[]> {\n return await this.requestJson<readonly TeamDynamixNamedEntity[]>(`/api/${appId}/services/categories`);\n }\n\n private async requestJson<T>(path: string, options: TeamDynamixRequestOptions = {}): Promise<T> {\n const headers = new Headers(options.headers);\n headers.set('Accept', 'application/json');\n\n if (options.body && !headers.has('Content-Type') && !(options.body instanceof FormData)) {\n headers.set('Content-Type', 'application/json');\n }\n\n const token = await this.getBearerToken(options.requireAdmin ?? false);\n headers.set('Authorization', `Bearer ${token}`);\n\n const requestInit: RequestInit = {\n method: options.method ?? 'GET',\n headers,\n body: options.body,\n };\n\n const endpoint = `${this.config.baseUrl}${normalizePath(path)}`;\n\n const cappedRetries = Math.min(this.config.maxRetries, TEAMDYNAMIX_MAX_RETRY_ATTEMPTS);\n\n await this.rateLimiter.acquire();\n\n for (let attempt = 0; attempt <= cappedRetries; attempt += 1) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeoutMs);\n let response: Response;\n try {\n response = await fetch(endpoint, { ...requestInit, signal: controller.signal });\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (response.status === 429 && attempt < cappedRetries) {\n const rateLimit = parseRateLimit(response.headers);\n if (LOG_LEVEL === 'debug') {\n console.error(\n `[teamdynamix-mcp] rate limited on ${normalizePath(path)}; retry ${attempt + 1}/${cappedRetries} in ${rateLimit.waitMs}ms`,\n );\n }\n await sleep(rateLimit.waitMs);\n continue;\n }\n\n if (!response.ok) {\n await response.text();\n throw new Error(`TeamDynamix request failed (${response.status}) for ${normalizePath(path)}.`);\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n const data = (await response.json()) as T;\n // Validate response structure at runtime\n if (Array.isArray(data)) {\n TeamDynamixListResponseSchema.parse(data);\n } else if (typeof data === 'object' && data !== null) {\n TeamDynamixSingleResponseSchema.parse(data);\n }\n return data;\n }\n\n const text = await response.text();\n return text as T;\n }\n\n throw new Error(`TeamDynamix request exceeded retry budget for ${normalizePath(path)}.`);\n }\n\n private async getBearerToken(requireAdmin: boolean): Promise<string> {\n const configStatus = getTeamDynamixConfigStatus(this.config);\n if (!configStatus.configured) {\n throw new Error(\n `TeamDynamix is not configured. Missing: ${configStatus.missing.join(', ')}. ` +\n 'Populate the required environment variables in .env before using TeamDynamix tools.',\n );\n }\n\n if (requireAdmin && this.config.authMode !== 'admin') {\n throw new Error(\n 'This TeamDynamix action requires admin authentication, but TEAMDYNAMIX_AUTH_MODE is not set to admin.',\n );\n }\n\n const expiresAtMs = this.cachedToken?.expiresAtMs;\n if (this.cachedToken && (!expiresAtMs || expiresAtMs > Date.now() + 60_000)) {\n return this.cachedToken.token;\n }\n\n const token = await this.login();\n return token;\n }\n\n private async login(): Promise<string> {\n if (!this.config.baseUrl) {\n throw new Error('TeamDynamix base URL is not configured. Set TEAMDYNAMIX_BASE_URL.');\n }\n\n const isAdmin = this.config.authMode === 'admin';\n const loginPath = isAdmin ? '/api/auth/loginadmin' : '/api/auth/login';\n const body = isAdmin\n ? JSON.stringify({ BEID: this.config.beid, WebServicesKey: this.config.webServicesKey })\n : JSON.stringify({ username: this.config.username, password: this.config.password });\n\n const loginController = new AbortController();\n const loginTimeoutId = setTimeout(() => loginController.abort(), this.config.timeoutMs);\n let response: Response;\n try {\n response = await fetch(`${this.config.baseUrl}${loginPath}`, {\n method: 'POST',\n headers: {\n Accept: 'application/json, text/plain;q=0.9',\n 'Content-Type': 'application/json',\n },\n body,\n signal: loginController.signal,\n });\n } finally {\n clearTimeout(loginTimeoutId);\n }\n\n if (!response.ok) {\n await response.text();\n throw new Error(`TeamDynamix authentication failed (${response.status}).`);\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n const payload = contentType.includes('application/json')\n ? ((await response.json()) as unknown)\n : await response.text();\n const token = extractAuthToken(payload);\n // TeamDynamix token expiry is derived from the JWT `exp` claim for cache invalidation.\n // Signature verification is not performed client-side because TeamDynamix validates token integrity server-side.\n const expiryEpochSeconds = decodeJwtExpiryEpochSeconds(token);\n\n this.cachedToken = {\n token,\n expiresAtMs: expiryEpochSeconds ? expiryEpochSeconds * 1_000 : null,\n };\n\n return token;\n }\n}\n\nexport function createConfiguredTeamDynamixClient(): TeamDynamixClient {\n return new TeamDynamixClient(getTeamDynamixConfig());\n}\n"],"mappings":"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","names":["McpServer","z","z","z","z","z","server","server","McpServer"]}
|