@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 CHANGED
@@ -1,4 +1,6 @@
1
- # teamdynamix-mcp
1
+ # 🎟️ TeamDynamix MCP Server (unofficial)
2
+
3
+ ![NPM Version](https://img.shields.io/npm/v/@selfagency/teamdynamix-mcp) [![CI](https://github.com/selfagency/teamdynamix-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/selfagency/teamdynamix-mcp/actions/workflows/ci.yml) [![codecov](https://codecov.io/gh/selfagency/teamdynamix-mcp/graph/badge.svg?token=kYslnQkMFy)](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 © [Daniel Sieradski](https://self.agency)
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 LOG_LEVEL = process.env["MCP_LOG_LEVEL"] === "debug" || process.env["MCP_LOG_LEVEL"] === "warn" || process.env["MCP_LOG_LEVEL"] === "error" ? process.env["MCP_LOG_LEVEL"] : "info";
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: z3.string().optional().describe("ISO 8601 start date for creation date filter."),
217
- CreatedDateTo: z3.string().optional().describe("ISO 8601 end date for creation date filter."),
218
- ModifiedDateFrom: z3.string().optional().describe("ISO 8601 start date for last-modified filter."),
219
- ModifiedDateTo: z3.string().optional().describe("ISO 8601 end date for last-modified filter."),
220
- ClosedDateFrom: z3.string().optional().describe("ISO 8601 start date for closed date filter."),
221
- ClosedDateTo: z3.string().optional().describe("ISO 8601 end date for closed date filter."),
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: z3.string().optional().describe("Task start date (ISO 8601)."),
312
- EndDate: z3.string().optional().describe("Task due date (ISO 8601).")
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: z3.string().optional().describe("Issue due date (ISO 8601).")
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: z3.string().optional().describe("Risk resolution due date (ISO 8601).")
356
+ DueDate: IsoDateSchema.optional().describe("Risk resolution due date (ISO 8601).")
350
357
  });
351
358
  var TimeEntryQuerySchema = z3.object({
352
- StartDate: z3.string().describe("Start date for time entries query (ISO 8601 date, e.g. 2026-01-01)."),
353
- EndDate: z3.string().describe("End date for time entries query (ISO 8601 date, e.g. 2026-01-31).")
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
- return await this.requestJson(
471
- `/api/${appId}/tickets?NotifyRequestor=${notifyRequestor}&NotifyResponsible=${notifyResponsible}`,
472
- {
473
- method: "POST",
474
- body: JSON.stringify(body)
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 response = await fetch(endpoint, requestInit);
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 response = await fetch(`${this.config.baseUrl}${loginPath}`, {
759
- method: "POST",
760
- headers: {
761
- Accept: "application/json, text/plain;q=0.9",
762
- "Content-Type": "application/json"
763
- },
764
- body
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@selfagency/teamdynamix-mcp",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "A production-ready TypeScript MCP server for TeamDynamix",
5
5
  "keywords": [
6
6
  "mcp",