@selfagency/teamdynamix-mcp 0.2.0 → 0.2.2
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 +10 -10
- package/index.js +26 -1
- package/index.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -6,12 +6,11 @@ A TypeScript [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) se
|
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
9
|
-
- **Powered by the official TeamDynamix TypeScript SDK**: type-safe, auto-generated API methods with built-in retry, exponential backoff, runtime validation, and token lifecycle management
|
|
10
9
|
- **11 domain gateway tools** that route validated actions across discovery,
|
|
11
10
|
tickets, relationships, KB, assets, CMDB, people, services, projects,
|
|
12
11
|
time, and reference data
|
|
13
|
-
- **Safe by default**: write tools disabled until
|
|
14
|
-
destructive operations require `confirm: true`
|
|
12
|
+
- **Safe by default**: write, delete, and admin tools disabled until
|
|
13
|
+
explicitly opted in; destructive operations require `confirm: true`
|
|
15
14
|
- **Two auth modes**: standard (username/password) and admin (BEID/WebServicesKey)
|
|
16
15
|
- **Covers 207 API endpoints** across all TeamDynamix domains, verified against the SDK route manifest
|
|
17
16
|
- **Rate-limit aware**: SDK built-in retry with exponential backoff on 429 and 5xx responses
|
|
@@ -156,13 +155,14 @@ All write/mutating actions require `TEAMDYNAMIX_ENABLE_WRITE_TOOLS=true`.
|
|
|
156
155
|
|
|
157
156
|
## Safety defaults
|
|
158
157
|
|
|
159
|
-
| Flag
|
|
160
|
-
|
|
|
161
|
-
| `TEAMDYNAMIX_ENABLE_WRITE_TOOLS`
|
|
162
|
-
| `
|
|
158
|
+
| Flag | Default | Effect when `true` |
|
|
159
|
+
| --------------------------------- | ------- | --------------------------------------------------------- |
|
|
160
|
+
| `TEAMDYNAMIX_ENABLE_WRITE_TOOLS` | `false` | Enables all create/update/comment/mutation tools |
|
|
161
|
+
| `TEAMDYNAMIX_ENABLE_DELETE_TOOLS` | `false` | Enables asset, CI, service, and service category deletion |
|
|
162
|
+
| `TEAMDYNAMIX_ENABLE_ADMIN_TOOLS` | `false` | Enables admin-scope operations |
|
|
163
163
|
|
|
164
|
-
Destructive
|
|
165
|
-
tool call regardless of
|
|
164
|
+
Destructive operations additionally require `confirm: true` in the
|
|
165
|
+
tool call regardless of the flag state.
|
|
166
166
|
|
|
167
167
|
## Agent skill
|
|
168
168
|
|
|
@@ -193,7 +193,7 @@ Install the skill via your Copilot skill configuration
|
|
|
193
193
|
```sh
|
|
194
194
|
pnpm typecheck # TypeScript strict checks
|
|
195
195
|
pnpm lint # oxlint
|
|
196
|
-
pnpm test # vitest (
|
|
196
|
+
pnpm test # vitest (200+ tests, 90%+ coverage)
|
|
197
197
|
pnpm build # tsup → dist/
|
|
198
198
|
```
|
|
199
199
|
|
package/index.js
CHANGED
|
@@ -345,7 +345,31 @@ var TeamDynamixListResponseSchema = z3.array(z3.record(z3.string(), z3.unknown()
|
|
|
345
345
|
var TeamDynamixSingleResponseSchema = z3.record(z3.string(), z3.unknown()).describe("Single TeamDynamix entity response");
|
|
346
346
|
|
|
347
347
|
// src/client/sdk-client.factory.ts
|
|
348
|
+
import { existsSync } from "fs";
|
|
349
|
+
import { createRequire } from "module";
|
|
350
|
+
import { dirname, resolve } from "path";
|
|
351
|
+
import { fileURLToPath } from "url";
|
|
348
352
|
import { createTeamDynamixClient, loginWithPassword, loginWithServiceAccount } from "@selfagency/teamdynamix-ts";
|
|
353
|
+
var cachedSpecPath;
|
|
354
|
+
function resolveSdkSpecPath() {
|
|
355
|
+
const override = process.env["TEAMDYNAMIX_SPEC_PATH"]?.trim();
|
|
356
|
+
if (override) return override;
|
|
357
|
+
if (cachedSpecPath) return cachedSpecPath;
|
|
358
|
+
try {
|
|
359
|
+
const require2 = createRequire(fileURLToPath(import.meta.url));
|
|
360
|
+
const pkgPath = require2.resolve("@selfagency/teamdynamix-ts/package.json");
|
|
361
|
+
const pkgRoot = dirname(pkgPath);
|
|
362
|
+
const candidates = [
|
|
363
|
+
resolve(pkgRoot, "dist/generated/openapi.json"),
|
|
364
|
+
resolve(pkgRoot, "generated/openapi.json"),
|
|
365
|
+
resolve(pkgRoot, "src/generated/openapi.json")
|
|
366
|
+
];
|
|
367
|
+
cachedSpecPath = candidates.find((p) => existsSync(p));
|
|
368
|
+
return cachedSpecPath;
|
|
369
|
+
} catch {
|
|
370
|
+
return void 0;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
349
373
|
function createTokenProvider(config, tenant) {
|
|
350
374
|
if (config.authMode === "admin") {
|
|
351
375
|
if (!config.beid || !config.webServicesKey) {
|
|
@@ -379,7 +403,8 @@ function buildSdkConfig(config, tenant, tokenProvider) {
|
|
|
379
403
|
environment: config.baseUrl?.includes("sandbox") ? "sandbox" : "production",
|
|
380
404
|
baseUrl: config.baseUrl,
|
|
381
405
|
timeoutMs: config.timeoutMs,
|
|
382
|
-
runtimeValidationMode:
|
|
406
|
+
runtimeValidationMode: "fail-open",
|
|
407
|
+
...resolveSdkSpecPath() ? { specPath: resolveSdkSpecPath() } : {},
|
|
383
408
|
retryPolicy: {
|
|
384
409
|
maxRetries: config.maxRetries
|
|
385
410
|
}
|
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/client/sdk-client.factory.ts","../src/services/teamdynamix/client.factory.ts","../src/services/teamdynamix/render.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\n/**\n * Whether to use the TeamDynamix SDK instead of the HTTP client.\n */\n/**\n * Whether to use the TeamDynamix SDK instead of the HTTP client.\n * Evaluated lazily so tests can set env vars via beforeEach.\n */\nexport function isUseSdk(): boolean {\n const parsed = z.enum(['true', 'false']).safeParse(process.env['TEAMDYNAMIX_USE_SDK']?.trim().toLowerCase());\n return parsed.success ? parsed.data === 'true' : true;\n}\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 enableDeleteTools: normalizeBoolean(process.env['TEAMDYNAMIX_ENABLE_DELETE_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 {\n assertWriteToolsEnabled,\n assertDeleteToolsEnabled,\n createConfiguredTeamDynamixClient,\n} from '../services/teamdynamix/client.factory.js';\nimport { redactTeamDynamixConfig } from '../services/teamdynamix/core.service.js';\nimport { render } from '../services/teamdynamix/render.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 'delete_asset',\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 'delete_ci',\n]);\n\nconst teamdynamixServicesActionSchema = z.enum([\n 'list_services',\n 'get_service',\n 'search_services',\n 'list_service_categories',\n 'delete_service',\n 'delete_service_category',\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 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(\n payload: unknown,\n responseFormat: ResponseFormat,\n): {\n content: Array<{ type: 'text'; text: string }>;\n structuredContent: Record<string, unknown>;\n isError?: false;\n} {\n return {\n content: [{ type: 'text' as const, text: render(payload, responseFormat) }],\n structuredContent: toStructuredContent(payload),\n };\n}\n\nfunction toErrorResponse(error: unknown): {\n content: Array<{ type: 'text'; text: string }>;\n structuredContent: { ok: false; kind: string; message: string };\n isError: true;\n} {\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 case 'delete_asset': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n asset_id: z.number().int().positive(),\n confirm: z.literal(true),\n }),\n payload,\n action,\n );\n assertDeleteToolsEnabled(getTeamDynamixConfig());\n await client.deleteAsset(parsed.app_id, parsed.asset_id);\n return toSuccessResponse(\n { appId: parsed.app_id, assetId: parsed.asset_id, deleted: true },\n response_format,\n );\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 case 'delete_ci': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n ci_id: z.number().int().positive(),\n confirm: z.literal(true),\n }),\n payload,\n action,\n );\n assertDeleteToolsEnabled(getTeamDynamixConfig());\n await client.deleteConfigurationItem(parsed.app_id, parsed.ci_id);\n return toSuccessResponse({ appId: parsed.app_id, ciId: parsed.ci_id, deleted: true }, 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 case 'delete_service': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n service_id: z.number().int().positive(),\n confirm: z.literal(true),\n }),\n payload,\n action,\n );\n assertDeleteToolsEnabled(getTeamDynamixConfig());\n await client.deleteService(parsed.app_id, parsed.service_id);\n return toSuccessResponse(\n { appId: parsed.app_id, serviceId: parsed.service_id, deleted: true },\n response_format,\n );\n }\n case 'delete_service_category': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n category_id: z.number().int().positive(),\n confirm: z.literal(true),\n }),\n payload,\n action,\n );\n assertDeleteToolsEnabled(getTeamDynamixConfig());\n await client.deleteServiceCategory(parsed.app_id, parsed.category_id);\n return toSuccessResponse(\n { appId: parsed.app_id, categoryId: parsed.category_id, deleted: true },\n response_format,\n );\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 { createTeamDynamixClient, loginWithPassword, loginWithServiceAccount } from '@selfagency/teamdynamix-ts';\nimport type { TeamDynamixClientConfig, TeamDynamixSdk } from '@selfagency/teamdynamix-ts';\nimport type { TeamDynamixConfig } from '../types.js';\n\n/**\n * Creates a token provider for the SDK client.\n *\n * Supports two auth modes:\n * - Standard: username/password\n * - Admin: BEID/WebServicesKey\n */\nfunction createTokenProvider(config: TeamDynamixConfig, tenant: string): () => string | Promise<string> {\n if (config.authMode === 'admin') {\n if (!config.beid || !config.webServicesKey) {\n throw new Error('BEID and WebServicesKey are required for admin authentication');\n }\n\n return loginWithServiceAccount({\n tenant,\n beid: config.beid,\n webServicesKey: config.webServicesKey,\n });\n }\n\n if (!config.username || !config.password) {\n throw new Error('Username and password are required for standard authentication');\n }\n\n return loginWithPassword({\n tenant,\n username: config.username,\n password: config.password,\n });\n}\n\n/**\n * Extracts the tenant from a baseUrl.\n *\n * Examples:\n * - \"https://mytenant.teamdynamix.com/TDWebApi\" → \"mytenant\"\n * - \"https://td.myuniversity.edu/TDWebApi\" → \"td.myuniversity.edu\"\n */\nfunction extractTenant(baseUrl: string): string {\n const normalized = baseUrl.replace(/\\/+$/, '').replace(/\\/TDWebApi$/, '');\n const withoutProtocol = normalized.replace(/^https?:\\/\\//, '');\n const parts = withoutProtocol.split('/');\n return parts[0] ?? '';\n}\n\n/**\n * Builds an SDK client config from the MCP server config.\n */\nfunction buildSdkConfig(\n config: TeamDynamixConfig,\n tenant: string,\n tokenProvider: () => string | Promise<string>,\n): TeamDynamixClientConfig {\n return {\n tenant,\n tokenProvider,\n environment: config.baseUrl?.includes('sandbox') ? 'sandbox' : 'production',\n baseUrl: config.baseUrl,\n timeoutMs: config.timeoutMs,\n runtimeValidationMode: config.enableAdminTools ? 'fail-closed' : 'fail-open',\n retryPolicy: {\n maxRetries: config.maxRetries,\n },\n };\n}\n\n/**\n * Creates an SDK client from MCP config.\n * Returns the TeamDynamix SDK client with full domain access.\n */\nexport async function createMcpSdkClient(config: TeamDynamixConfig): Promise<TeamDynamixSdk> {\n const tenant = extractTenant(config.baseUrl ?? '');\n const tokenProvider = createTokenProvider(config, tenant);\n const sdkConfig = buildSdkConfig(config, tenant, tokenProvider);\n const { client } = await createTeamDynamixClient(sdkConfig);\n return client;\n}\n","import { createMcpSdkClient } from '../../client/sdk-client.factory.js';\nimport { getTeamDynamixConfig } from '../../config.js';\nimport type { TeamDynamixConfig } from '../../types.js';\n\n/**\n * SDK-backed TeamDynamix client.\n */\nexport class UnifiedTeamDynamixClient {\n private sdkPromise: Promise<Awaited<ReturnType<typeof createMcpSdkClient>>> | null = null;\n\n constructor(private readonly config: TeamDynamixConfig) {}\n\n private sdk() {\n this.sdkPromise ??= createMcpSdkClient(this.config);\n return this.sdkPromise;\n }\n\n //\n // Discovery\n //\n getCurrentUser(): Promise<unknown> {\n return this.sdk().then(s => s.discovery.authGetuser());\n }\n listApplications(): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.discovery.applications()) as Promise<readonly unknown[]>;\n }\n\n //\n // Tickets\n //\n getTicket(appId: number, ticketId: number): Promise<unknown> {\n return this.sdk().then(s => s.tickets.appIdTicketsId({ params: { path: { appId, id: ticketId } } }));\n }\n searchTickets(appId: number, _body: Record<string, unknown>): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsFeed({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listTicketTypes(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsTypes({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listTicketPriorities(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsPriorities({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listTicketUrgencies(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsUrgencies({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listTicketImpacts(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsImpacts({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listTicketSources(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsSources({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n getTicketFeed(appId: number, ticketId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsIdFeed({ params: { path: { appId, id: ticketId } } })) as Promise<\n readonly unknown[]\n >;\n }\n\n //\n // Ticket Relationships\n //\n getTicketTasks(appId: number, ticketId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.ticketRelationships.appIdTicketsTicketIdTasks({ params: { path: { appId, ticketId } } }),\n ) as Promise<readonly unknown[]>;\n }\n createTicketTask(appId: number, ticketId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.sdk().then(s => s.ticketRelationships.createTicketTask({ appId, ticketId, body }));\n }\n listTicketAssets(appId: number, ticketId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.ticketRelationships.appIdTicketsIdAssets({ params: { path: { appId, id: ticketId } } }),\n ) as Promise<readonly unknown[]>;\n }\n addTicketAsset(appId: number, ticketId: number, assetId: number): Promise<unknown> {\n return this.sdk().then(s => s.ticketRelationships.addTicketAsset({ appId, ticketId, assetId }));\n }\n removeTicketAsset(appId: number, ticketId: number, assetId: number): Promise<void> {\n return this.sdk().then(s => {\n s.ticketRelationships.removeTicketAsset({ appId, ticketId, assetId, confirm: true });\n }) as Promise<void>;\n }\n getTicketContacts(appId: number, ticketId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.ticketRelationships.appIdTicketsIdContacts({ params: { path: { appId, id: ticketId } } }),\n ) as Promise<readonly unknown[]>;\n }\n addTicketContact(appId: number, ticketId: number, contactUid: string): Promise<unknown> {\n return this.sdk().then(s => s.ticketRelationships.addTicketContact({ appId, ticketId, contactUid }));\n }\n removeTicketContact(appId: number, ticketId: number, contactUid: string): Promise<void> {\n return this.sdk().then(s => {\n s.ticketRelationships.removeTicketContact({ appId, ticketId, contactUid, confirm: true });\n }) as Promise<void>;\n }\n\n //\n // People\n //\n getUser(uid: string): Promise<unknown> {\n return this.sdk().then(s => s.people.peopleUid({ params: { path: { uid } } }));\n }\n searchUsers(body: Record<string, unknown>): Promise<readonly unknown[]> {\n const searchText = typeof body['SearchText'] === 'string' ? body['SearchText'] : '';\n return this.sdk().then(s => s.people.peopleLookup({ body: { SearchText: searchText } })) as Promise<\n readonly unknown[]\n >;\n }\n getGroup(groupId: number): Promise<unknown> {\n return this.sdk().then(s => s.people.groupsId({ params: { path: { id: groupId } } }));\n }\n searchGroups(_body: Record<string, unknown>): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.people.searchGroups({ body: {} })) as Promise<readonly unknown[]>;\n }\n getGroupMembers(groupId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.people.groupsIdMembers({ params: { path: { id: groupId } } })) as Promise<\n readonly unknown[]\n >;\n }\n\n //\n // Knowledge Base\n //\n getKbArticle(appId: number, articleId: number): Promise<unknown> {\n return this.sdk().then(s => s.knowledgeBase.appIdKnowledgebaseId({ params: { path: { appId, id: articleId } } }));\n }\n searchKbArticles(appId: number, body: Record<string, unknown>): Promise<readonly unknown[]> {\n const keyword = typeof body['SearchText'] === 'string' ? body['SearchText'] : '';\n // Perform a simple keyword lookup via the knowledgebase article endpoint\n return this.sdk()\n .then(s => s.knowledgeBase.appIdKnowledgebaseId({ params: { path: { appId, id: 0 } } }))\n .then(r =>\n Array.isArray(r)\n ? r.filter(item => {\n const s = typeof item === 'object' && item !== null ? JSON.stringify(item).toLowerCase() : '';\n return keyword ? s.includes(keyword.toLowerCase()) : true;\n })\n : [],\n ) as Promise<readonly unknown[]>;\n }\n listKbCategories(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.knowledgeBase.appIdKnowledgebaseCategories({ params: { path: { appId } } }),\n ) as Promise<readonly unknown[]>;\n }\n\n //\n // Assets\n //\n getAsset(appId: number, assetId: number): Promise<unknown> {\n return this.sdk().then(s => s.assets.appIdAssetsId({ params: { path: { appId, id: assetId } } }));\n }\n searchAssets(appId: number, _body: Record<string, unknown>): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.assets.appIdAssetsFeed({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listAssetStatuses(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.assets.appIdAssetsStatuses({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listProductModels(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.assets.appIdAssetsModels({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listVendors(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.cmdb.appIdAssetsVendors({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n\n //\n // CMDB\n //\n getConfigurationItem(appId: number, ciId: number): Promise<unknown> {\n return this.sdk().then(s => s.cmdb.appIdCmdbId({ params: { path: { appId, id: ciId } } }));\n }\n searchConfigurationItems(appId: number, _body: Record<string, unknown>): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.cmdb.appIdCmdbSearches({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listCiTypes(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.cmdb.appIdCmdbTypes({ params: { path: { appId } } })) as Promise<readonly unknown[]>;\n }\n listCiRelationshipTypes(): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.cmdb.appIdCmdbRelationshiptypes()) as Promise<readonly unknown[]>;\n }\n\n //\n // Services\n //\n listServiceCatalog(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.services.appIdServices({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n getService(appId: number, serviceId: number): Promise<unknown> {\n return this.sdk().then(s => s.services.appIdServicesId({ params: { path: { appId, id: serviceId } } }));\n }\n searchServices(appId: number, body: Record<string, unknown>): Promise<readonly unknown[]> {\n const keyword = typeof body['Keyword'] === 'string' ? body['Keyword'] : '';\n return this.sdk()\n .then(s => s.services.appIdServices({ params: { path: { appId } } }))\n .then(r => {\n if (!Array.isArray(r)) return [];\n if (!keyword) return r;\n const lower = keyword.toLowerCase();\n return r.filter(item => {\n const text = typeof item === 'object' && item !== null ? JSON.stringify(item).toLowerCase() : '';\n return text.includes(lower);\n });\n }) as Promise<readonly unknown[]>;\n }\n listServiceCategories(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.services.appIdServicesCategories({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n\n //\n // Projects\n //\n getProject(projectId: number): Promise<unknown> {\n return this.sdk().then(s => s.projects.projectsId({ params: { path: { id: projectId } } }));\n }\n searchProjects(_body: Record<string, unknown>): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.projects.projectsFeed()) as Promise<readonly unknown[]>;\n }\n listProjectTypes(): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.projects.projectsTypes()) as Promise<readonly unknown[]>;\n }\n getProjectPlans(projectId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.projects.projectsProjectIDPlansPlanID({ params: { path: { id: projectId } } }),\n ) as Promise<readonly unknown[]>;\n }\n getProjectIssues(projectId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.projects.projectsProjectIdIssuesCategories({ params: { path: { id: projectId } } }),\n ) as Promise<readonly unknown[]>;\n }\n getProjectRisks(projectId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.projects.projectsProjectIdRisksCategories({ params: { path: { id: projectId } } }),\n ) as Promise<readonly unknown[]>;\n }\n\n //\n // Time\n //\n listTimeTypes(): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.time.timeTypes()) as Promise<readonly unknown[]>;\n }\n getMyTimeEntries(_startDate: string, _endDate: string): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.time.timeId({ params: { path: { id: 0 } } })) as Promise<readonly unknown[]>;\n }\n\n //\n // Reference Data\n //\n listAccounts(_appId?: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.referenceData.accounts()) as Promise<readonly unknown[]>;\n }\n getAccount(accountId: number): Promise<unknown> {\n return this.sdk().then(s => s.referenceData.accountsId({ params: { path: { id: accountId } } }));\n }\n listLocations(): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.referenceData.locations()) as Promise<readonly unknown[]>;\n }\n listFunctionalRoles(): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.referenceData.securityrolesPermissions()) as Promise<readonly unknown[]>;\n }\n listCustomAttributes(_componentId: number, _appId?: number, _associatedTypeId?: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.referenceData.attributesCustom()) as Promise<readonly unknown[]>;\n }\n listTicketStatuses(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.referenceData.appIdTicketsStatuses({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n\n //\n // Mutations\n //\n createTicket(\n appId: number,\n body: Record<string, unknown>,\n _notifyRequestor?: boolean,\n _notifyResponsible?: boolean,\n ): Promise<unknown> {\n return this.sdk().then(s => s.tickets.createTicket({ appId, body }));\n }\n updateTicket(\n appId: number,\n ticketId: number,\n body: Record<string, unknown>,\n _notifyRequestor?: boolean,\n _notifyResponsible?: boolean,\n _comments?: string,\n _isPrivate?: boolean,\n ): Promise<unknown> {\n return this.sdk().then(s => s.tickets.updateTicket({ appId, ticketId, body }));\n }\n addTicketComment(\n appId: number,\n ticketId: number,\n body: string,\n _isPrivate?: boolean,\n _notifyRequestor?: boolean,\n _notifyResponsible?: boolean,\n ): Promise<unknown> {\n return this.sdk().then(s => s.tickets.addTicketComment({ appId, ticketId, body: { Body: body } }));\n }\n createKbArticle(appId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.sdk().then(s => s.knowledgeBase.createArticle({ appId, body }));\n }\n updateKbArticle(appId: number, articleId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.sdk().then(s => s.knowledgeBase.updateArticle({ appId, articleId, body }));\n }\n createProjectIssue(_projectId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.sdk().then(s => s.projects.createIssue({ body }));\n }\n createProjectRisk(_projectId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.sdk().then(s => s.projects.createRisk({ body }));\n }\n\n //\n // Delete mutations (confirm:true required for all)\n //\n deleteAsset(appId: number, assetId: number): Promise<unknown> {\n return this.sdk().then(s => s.assets.deleteAsset({ appId, assetId, confirm: true }));\n }\n deleteConfigurationItem(appId: number, ciId: number): Promise<unknown> {\n return this.sdk().then(s => s.cmdb.deleteConfigurationItem({ appId, configurationItemId: ciId, confirm: true }));\n }\n deleteService(appId: number, serviceId: number): Promise<unknown> {\n return this.sdk().then(s => s.services.deleteService({ appId, serviceId, confirm: true }));\n }\n deleteServiceCategory(appId: number, categoryId: number): Promise<unknown> {\n return this.sdk().then(s => s.services.deleteServiceCategory({ appId, categoryId, confirm: true }));\n }\n deleteTimeEntry(timeEntryId: number): Promise<unknown> {\n return this.sdk().then(s => s.time.deleteTimeEntry({ timeEntryId, confirm: true }));\n }\n}\n\n/** Creates a configured SDK-backed TeamDynamix client. */\nexport function createConfiguredTeamDynamixClient(): UnifiedTeamDynamixClient {\n return new UnifiedTeamDynamixClient(getTeamDynamixConfig());\n}\n\nexport function assertWriteToolsEnabled(config: TeamDynamixConfig): void {\n if (!config.enableWriteTools) {\n throw new Error('Write tools are disabled. Set TEAMDYNAMIX_ENABLE_WRITE_TOOLS=true in your environment.');\n }\n}\n\nexport function assertDeleteToolsEnabled(config: TeamDynamixConfig): void {\n if (!config.enableDeleteTools) {\n throw new Error('Delete tools are disabled. Set TEAMDYNAMIX_ENABLE_DELETE_TOOLS=true in your environment.');\n }\n}\n","import { tablemark } from 'tablemark';\nimport { CHARACTER_LIMIT } from '../../constants.js';\nimport type { ResponseFormat } from '../../types.js';\n\n/**\n * Render payload to a string based on the requested format.\n * - 'json' returns pretty-printed JSON.\n * - 'markdown' returns human-readable markdown with tables for tabular data and metadata context.\n */\n\nexport function render(\n payload: unknown,\n responseFormat: ResponseFormat,\n characterLimit: number = CHARACTER_LIMIT,\n): string {\n if (responseFormat === 'json') {\n if (typeof payload === 'undefined') return 'undefined';\n return JSON.stringify(payload, null, 2);\n }\n\n // markdown path\n const markdown = renderMarkdown(payload);\n return truncateMarkdown(markdown, characterLimit);\n}\n\nfunction renderMarkdown(payload: unknown): string {\n if (payload == null) return '';\n if (typeof payload !== 'object') {\n // payload == null is already handled above; all remaining non-objects stringify directly\n return String(payload);\n }\n\n if (Array.isArray(payload)) {\n if (payload.length === 0) {\n return '';\n }\n // If array of objects, attempt to render as a table\n if (payload.every(isPlainObject)) {\n return renderArrayAsMarkdownTable(payload);\n }\n // Otherwise fall back to JSON block\n return '```json\\n' + JSON.stringify(payload, null, 2) + '\\n```';\n }\n\n // Single object: render as a compact key/value list unless it contains a table-eligible array\n if (isPlainObject(payload)) {\n const hasArrayOfObjects = Object.values(payload).some(isArrayOfPlainObjects);\n if (hasArrayOfObjects) {\n // Render the array(s) as tables and the rest as context\n return renderObjectWithTables(payload);\n }\n // Compact key/value list for single object\n return renderObjectAsMarkdownList(payload);\n }\n\n return '';\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isArrayOfPlainObjects(value: unknown): value is readonly Record<string, unknown>[] {\n return Array.isArray(value) && value.length > 0 && value.every(isPlainObject);\n}\n\n/**\n * Serialize any value to a compact, human-readable string.\n * Avoids '[object Object]' for nested structures.\n */\nfunction serializeValue(value: unknown): string {\n if (typeof value !== 'object' || value === null) return String(value);\n if (Array.isArray(value)) return value.map(serializeValue).join(', ');\n return (\n '{ ' +\n Object.entries(value)\n .map(([k, v]) => `${k}: ${typeof v === 'object' && v !== null ? '[Object]' : String(v)}`)\n .join(', ') +\n ' }'\n );\n}\n\nfunction renderObjectAsMarkdownList(obj: Record<string, unknown>): string {\n const lines: string[] = [];\n for (const [key, val] of Object.entries(obj)) {\n lines.push(`- **${key}**: ${truncateCell(serializeValue(val))}`);\n }\n return lines.join('\\n');\n}\n\nfunction renderObjectWithTables(obj: Record<string, unknown>): string {\n const lines: string[] = [];\n // First, emit scalar metadata as a bullet list\n const scalarEntries: [string, unknown][] = [];\n const arrayEntries: [string, readonly Record<string, unknown>[]][] = [];\n\n for (const [key, val] of Object.entries(obj)) {\n if (isArrayOfPlainObjects(val)) {\n arrayEntries.push([key, val]);\n } else {\n scalarEntries.push([key, val]);\n }\n }\n\n if (scalarEntries.length > 0) {\n lines.push('**Metadata:**');\n for (const [key, val] of scalarEntries) {\n lines.push(`- **${key}**: ${truncateCell(serializeValue(val))}`);\n }\n lines.push('');\n }\n\n // Then render each array as a markdown table\n for (const [key, arr] of arrayEntries) {\n lines.push(`**${key}:**`);\n const table = renderArrayAsMarkdownTable(arr);\n lines.push(table);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction renderArrayAsMarkdownTable(arr: readonly Record<string, unknown>[]): string {\n // tablemark expects iterable of objects; we'll provide a toCellText to handle nested values safely\n const toCellText = ({ value }: { key: string; value: unknown }): string => serializeValue(value);\n\n // Use headerFormatter to preserve original key casing\n // Generate table, then collapse multiple spaces between pipes to a single space\n let table = tablemark(arr, {\n toCellText,\n headerCase: 'preserve',\n });\n // Replace multiple spaces between pipes with a single space (for all header/row lines)\n table = table.replace(/\\| +/g, '| ').replace(/ +\\|/g, ' |');\n // Fix header separator row: force dashes to exactly 3, 4, 5, ... for columns 1, 2, 3, ...\n table = table.replace(\n /^(\\| +:)(-+)( +\\|)/gm,\n (_match: string, _pre: string, _dashes: string, _post: string, offset: number, str: string) => {\n // Only process the first header separator row\n if (str.slice(0, offset).includes(':---')) return _match;\n // Count columns by splitting the header row above\n const headerLine = str\n .slice(0, offset)\n .split('\\n')\n .reverse()\n .find((l: string) => l.startsWith('|'));\n if (!headerLine) return _match;\n const colCount = headerLine.split('|').length - 2;\n // Build the expected dash counts: 3, 4, 5, ...\n const dashCounts = Array.from({ length: colCount }, (_, i) => 3 + i);\n // Build the new separator row\n const newRow = ['']\n .concat(dashCounts.map(n => ` :${'-'.repeat(n)} `))\n .concat([''])\n .join('|');\n return newRow;\n },\n );\n return table;\n}\n\nfunction truncateCell(str: string): string {\n const MAX = 120;\n if (str.length <= MAX) return str;\n return str.slice(0, MAX) + '…';\n}\n\nfunction truncateMarkdown(markdown: string, limit: number): string {\n if (markdown.length <= limit) return markdown;\n const ellipsis = '...';\n // If limit is too small to fit even the ellipsis, return a clamped slice.\n if (limit <= ellipsis.length) return markdown.slice(0, limit);\n // Slice to fit, then strip trailing newlines before appending ellipsis.\n const truncated = markdown.slice(0, limit - ellipsis.length).replace(/\\n+$/, '');\n return truncated + ellipsis;\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/client/sdk-client.factory.ts","../src/services/teamdynamix/client.factory.ts","../src/services/teamdynamix/render.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\n/**\n * Whether to use the TeamDynamix SDK instead of the HTTP client.\n */\n/**\n * Whether to use the TeamDynamix SDK instead of the HTTP client.\n * Evaluated lazily so tests can set env vars via beforeEach.\n */\nexport function isUseSdk(): boolean {\n const parsed = z.enum(['true', 'false']).safeParse(process.env['TEAMDYNAMIX_USE_SDK']?.trim().toLowerCase());\n return parsed.success ? parsed.data === 'true' : true;\n}\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 enableDeleteTools: normalizeBoolean(process.env['TEAMDYNAMIX_ENABLE_DELETE_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 {\n assertWriteToolsEnabled,\n assertDeleteToolsEnabled,\n createConfiguredTeamDynamixClient,\n} from '../services/teamdynamix/client.factory.js';\nimport { redactTeamDynamixConfig } from '../services/teamdynamix/core.service.js';\nimport { render } from '../services/teamdynamix/render.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 'delete_asset',\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 'delete_ci',\n]);\n\nconst teamdynamixServicesActionSchema = z.enum([\n 'list_services',\n 'get_service',\n 'search_services',\n 'list_service_categories',\n 'delete_service',\n 'delete_service_category',\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 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(\n payload: unknown,\n responseFormat: ResponseFormat,\n): {\n content: Array<{ type: 'text'; text: string }>;\n structuredContent: Record<string, unknown>;\n isError?: false;\n} {\n return {\n content: [{ type: 'text' as const, text: render(payload, responseFormat) }],\n structuredContent: toStructuredContent(payload),\n };\n}\n\nfunction toErrorResponse(error: unknown): {\n content: Array<{ type: 'text'; text: string }>;\n structuredContent: { ok: false; kind: string; message: string };\n isError: true;\n} {\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 case 'delete_asset': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n asset_id: z.number().int().positive(),\n confirm: z.literal(true),\n }),\n payload,\n action,\n );\n assertDeleteToolsEnabled(getTeamDynamixConfig());\n await client.deleteAsset(parsed.app_id, parsed.asset_id);\n return toSuccessResponse(\n { appId: parsed.app_id, assetId: parsed.asset_id, deleted: true },\n response_format,\n );\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 case 'delete_ci': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n ci_id: z.number().int().positive(),\n confirm: z.literal(true),\n }),\n payload,\n action,\n );\n assertDeleteToolsEnabled(getTeamDynamixConfig());\n await client.deleteConfigurationItem(parsed.app_id, parsed.ci_id);\n return toSuccessResponse({ appId: parsed.app_id, ciId: parsed.ci_id, deleted: true }, 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 case 'delete_service': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n service_id: z.number().int().positive(),\n confirm: z.literal(true),\n }),\n payload,\n action,\n );\n assertDeleteToolsEnabled(getTeamDynamixConfig());\n await client.deleteService(parsed.app_id, parsed.service_id);\n return toSuccessResponse(\n { appId: parsed.app_id, serviceId: parsed.service_id, deleted: true },\n response_format,\n );\n }\n case 'delete_service_category': {\n const parsed = parsePayload(\n z.object({\n app_id: TeamDynamixAppIdSchema,\n category_id: z.number().int().positive(),\n confirm: z.literal(true),\n }),\n payload,\n action,\n );\n assertDeleteToolsEnabled(getTeamDynamixConfig());\n await client.deleteServiceCategory(parsed.app_id, parsed.category_id);\n return toSuccessResponse(\n { appId: parsed.app_id, categoryId: parsed.category_id, deleted: true },\n response_format,\n );\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 { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createTeamDynamixClient, loginWithPassword, loginWithServiceAccount } from '@selfagency/teamdynamix-ts';\nimport type { TeamDynamixClientConfig, TeamDynamixSdk } from '@selfagency/teamdynamix-ts';\nimport type { TeamDynamixConfig } from '../types.js';\n\n// ponytail: resolve spec from installed SDK package, not process.cwd() — host cwd is\n// C:\\Windows\\System32 under Raycast/MCP hosts. Remove when SDK ships module-relative defaultSpecPath.\nlet cachedSpecPath: string | undefined;\nfunction resolveSdkSpecPath(): string | undefined {\n const override = process.env['TEAMDYNAMIX_SPEC_PATH']?.trim();\n if (override) return override;\n if (cachedSpecPath) return cachedSpecPath;\n try {\n const require = createRequire(fileURLToPath(import.meta.url));\n const pkgPath = require.resolve('@selfagency/teamdynamix-ts/package.json');\n const pkgRoot = dirname(pkgPath);\n const candidates = [\n resolve(pkgRoot, 'dist/generated/openapi.json'),\n resolve(pkgRoot, 'generated/openapi.json'),\n resolve(pkgRoot, 'src/generated/openapi.json'),\n ];\n cachedSpecPath = candidates.find(p => existsSync(p));\n return cachedSpecPath;\n } catch {\n return undefined;\n }\n}\n/**\n * Creates a token provider for the SDK client.\n *\n * Supports two auth modes:\n * - Standard: username/password\n * - Admin: BEID/WebServicesKey\n */\nfunction createTokenProvider(config: TeamDynamixConfig, tenant: string): () => string | Promise<string> {\n if (config.authMode === 'admin') {\n if (!config.beid || !config.webServicesKey) {\n throw new Error('BEID and WebServicesKey are required for admin authentication');\n }\n\n return loginWithServiceAccount({\n tenant,\n beid: config.beid,\n webServicesKey: config.webServicesKey,\n });\n }\n\n if (!config.username || !config.password) {\n throw new Error('Username and password are required for standard authentication');\n }\n\n return loginWithPassword({\n tenant,\n username: config.username,\n password: config.password,\n });\n}\n\n/**\n * Extracts the tenant from a baseUrl.\n *\n * Examples:\n * - \"https://mytenant.teamdynamix.com/TDWebApi\" → \"mytenant\"\n * - \"https://td.myuniversity.edu/TDWebApi\" → \"td.myuniversity.edu\"\n */\nfunction extractTenant(baseUrl: string): string {\n const normalized = baseUrl.replace(/\\/+$/, '').replace(/\\/TDWebApi$/, '');\n const withoutProtocol = normalized.replace(/^https?:\\/\\//, '');\n const parts = withoutProtocol.split('/');\n return parts[0] ?? '';\n}\n\n/**\n * Builds an SDK client config from the MCP server config.\n */\nfunction buildSdkConfig(\n config: TeamDynamixConfig,\n tenant: string,\n tokenProvider: () => string | Promise<string>,\n): TeamDynamixClientConfig {\n return {\n tenant,\n tokenProvider,\n environment: config.baseUrl?.includes('sandbox') ? 'sandbox' : 'production',\n baseUrl: config.baseUrl,\n timeoutMs: config.timeoutMs,\n runtimeValidationMode: 'fail-open',\n ...(resolveSdkSpecPath() ? { specPath: resolveSdkSpecPath() as string } : {}),\n retryPolicy: {\n maxRetries: config.maxRetries,\n },\n };\n}\n\n/**\n * Creates an SDK client from MCP config.\n * Returns the TeamDynamix SDK client with full domain access.\n */\nexport async function createMcpSdkClient(config: TeamDynamixConfig): Promise<TeamDynamixSdk> {\n const tenant = extractTenant(config.baseUrl ?? '');\n const tokenProvider = createTokenProvider(config, tenant);\n const sdkConfig = buildSdkConfig(config, tenant, tokenProvider);\n const { client } = await createTeamDynamixClient(sdkConfig);\n return client;\n}\n","import { createMcpSdkClient } from '../../client/sdk-client.factory.js';\nimport { getTeamDynamixConfig } from '../../config.js';\nimport type { TeamDynamixConfig } from '../../types.js';\n\n/**\n * SDK-backed TeamDynamix client.\n */\nexport class UnifiedTeamDynamixClient {\n private sdkPromise: Promise<Awaited<ReturnType<typeof createMcpSdkClient>>> | null = null;\n\n constructor(private readonly config: TeamDynamixConfig) {}\n\n private sdk() {\n this.sdkPromise ??= createMcpSdkClient(this.config);\n return this.sdkPromise;\n }\n\n //\n // Discovery\n //\n getCurrentUser(): Promise<unknown> {\n return this.sdk().then(s => s.discovery.authGetuser());\n }\n listApplications(): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.discovery.applications()) as Promise<readonly unknown[]>;\n }\n\n //\n // Tickets\n //\n getTicket(appId: number, ticketId: number): Promise<unknown> {\n return this.sdk().then(s => s.tickets.appIdTicketsId({ params: { path: { appId, id: ticketId } } }));\n }\n searchTickets(appId: number, _body: Record<string, unknown>): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsFeed({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listTicketTypes(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsTypes({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listTicketPriorities(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsPriorities({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listTicketUrgencies(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsUrgencies({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listTicketImpacts(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsImpacts({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listTicketSources(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsSources({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n getTicketFeed(appId: number, ticketId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.tickets.appIdTicketsIdFeed({ params: { path: { appId, id: ticketId } } })) as Promise<\n readonly unknown[]\n >;\n }\n\n //\n // Ticket Relationships\n //\n getTicketTasks(appId: number, ticketId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.ticketRelationships.appIdTicketsTicketIdTasks({ params: { path: { appId, ticketId } } }),\n ) as Promise<readonly unknown[]>;\n }\n createTicketTask(appId: number, ticketId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.sdk().then(s => s.ticketRelationships.createTicketTask({ appId, ticketId, body }));\n }\n listTicketAssets(appId: number, ticketId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.ticketRelationships.appIdTicketsIdAssets({ params: { path: { appId, id: ticketId } } }),\n ) as Promise<readonly unknown[]>;\n }\n addTicketAsset(appId: number, ticketId: number, assetId: number): Promise<unknown> {\n return this.sdk().then(s => s.ticketRelationships.addTicketAsset({ appId, ticketId, assetId }));\n }\n removeTicketAsset(appId: number, ticketId: number, assetId: number): Promise<void> {\n return this.sdk().then(s => {\n s.ticketRelationships.removeTicketAsset({ appId, ticketId, assetId, confirm: true });\n }) as Promise<void>;\n }\n getTicketContacts(appId: number, ticketId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.ticketRelationships.appIdTicketsIdContacts({ params: { path: { appId, id: ticketId } } }),\n ) as Promise<readonly unknown[]>;\n }\n addTicketContact(appId: number, ticketId: number, contactUid: string): Promise<unknown> {\n return this.sdk().then(s => s.ticketRelationships.addTicketContact({ appId, ticketId, contactUid }));\n }\n removeTicketContact(appId: number, ticketId: number, contactUid: string): Promise<void> {\n return this.sdk().then(s => {\n s.ticketRelationships.removeTicketContact({ appId, ticketId, contactUid, confirm: true });\n }) as Promise<void>;\n }\n\n //\n // People\n //\n getUser(uid: string): Promise<unknown> {\n return this.sdk().then(s => s.people.peopleUid({ params: { path: { uid } } }));\n }\n searchUsers(body: Record<string, unknown>): Promise<readonly unknown[]> {\n const searchText = typeof body['SearchText'] === 'string' ? body['SearchText'] : '';\n return this.sdk().then(s => s.people.peopleLookup({ body: { SearchText: searchText } })) as Promise<\n readonly unknown[]\n >;\n }\n getGroup(groupId: number): Promise<unknown> {\n return this.sdk().then(s => s.people.groupsId({ params: { path: { id: groupId } } }));\n }\n searchGroups(_body: Record<string, unknown>): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.people.searchGroups({ body: {} })) as Promise<readonly unknown[]>;\n }\n getGroupMembers(groupId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.people.groupsIdMembers({ params: { path: { id: groupId } } })) as Promise<\n readonly unknown[]\n >;\n }\n\n //\n // Knowledge Base\n //\n getKbArticle(appId: number, articleId: number): Promise<unknown> {\n return this.sdk().then(s => s.knowledgeBase.appIdKnowledgebaseId({ params: { path: { appId, id: articleId } } }));\n }\n searchKbArticles(appId: number, body: Record<string, unknown>): Promise<readonly unknown[]> {\n const keyword = typeof body['SearchText'] === 'string' ? body['SearchText'] : '';\n // Perform a simple keyword lookup via the knowledgebase article endpoint\n return this.sdk()\n .then(s => s.knowledgeBase.appIdKnowledgebaseId({ params: { path: { appId, id: 0 } } }))\n .then(r =>\n Array.isArray(r)\n ? r.filter(item => {\n const s = typeof item === 'object' && item !== null ? JSON.stringify(item).toLowerCase() : '';\n return keyword ? s.includes(keyword.toLowerCase()) : true;\n })\n : [],\n ) as Promise<readonly unknown[]>;\n }\n listKbCategories(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.knowledgeBase.appIdKnowledgebaseCategories({ params: { path: { appId } } }),\n ) as Promise<readonly unknown[]>;\n }\n\n //\n // Assets\n //\n getAsset(appId: number, assetId: number): Promise<unknown> {\n return this.sdk().then(s => s.assets.appIdAssetsId({ params: { path: { appId, id: assetId } } }));\n }\n searchAssets(appId: number, _body: Record<string, unknown>): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.assets.appIdAssetsFeed({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listAssetStatuses(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.assets.appIdAssetsStatuses({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listProductModels(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.assets.appIdAssetsModels({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listVendors(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.cmdb.appIdAssetsVendors({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n\n //\n // CMDB\n //\n getConfigurationItem(appId: number, ciId: number): Promise<unknown> {\n return this.sdk().then(s => s.cmdb.appIdCmdbId({ params: { path: { appId, id: ciId } } }));\n }\n searchConfigurationItems(appId: number, _body: Record<string, unknown>): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.cmdb.appIdCmdbSearches({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n listCiTypes(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.cmdb.appIdCmdbTypes({ params: { path: { appId } } })) as Promise<readonly unknown[]>;\n }\n listCiRelationshipTypes(): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.cmdb.appIdCmdbRelationshiptypes()) as Promise<readonly unknown[]>;\n }\n\n //\n // Services\n //\n listServiceCatalog(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.services.appIdServices({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n getService(appId: number, serviceId: number): Promise<unknown> {\n return this.sdk().then(s => s.services.appIdServicesId({ params: { path: { appId, id: serviceId } } }));\n }\n searchServices(appId: number, body: Record<string, unknown>): Promise<readonly unknown[]> {\n const keyword = typeof body['Keyword'] === 'string' ? body['Keyword'] : '';\n return this.sdk()\n .then(s => s.services.appIdServices({ params: { path: { appId } } }))\n .then(r => {\n if (!Array.isArray(r)) return [];\n if (!keyword) return r;\n const lower = keyword.toLowerCase();\n return r.filter(item => {\n const text = typeof item === 'object' && item !== null ? JSON.stringify(item).toLowerCase() : '';\n return text.includes(lower);\n });\n }) as Promise<readonly unknown[]>;\n }\n listServiceCategories(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.services.appIdServicesCategories({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n\n //\n // Projects\n //\n getProject(projectId: number): Promise<unknown> {\n return this.sdk().then(s => s.projects.projectsId({ params: { path: { id: projectId } } }));\n }\n searchProjects(_body: Record<string, unknown>): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.projects.projectsFeed()) as Promise<readonly unknown[]>;\n }\n listProjectTypes(): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.projects.projectsTypes()) as Promise<readonly unknown[]>;\n }\n getProjectPlans(projectId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.projects.projectsProjectIDPlansPlanID({ params: { path: { id: projectId } } }),\n ) as Promise<readonly unknown[]>;\n }\n getProjectIssues(projectId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.projects.projectsProjectIdIssuesCategories({ params: { path: { id: projectId } } }),\n ) as Promise<readonly unknown[]>;\n }\n getProjectRisks(projectId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s =>\n s.projects.projectsProjectIdRisksCategories({ params: { path: { id: projectId } } }),\n ) as Promise<readonly unknown[]>;\n }\n\n //\n // Time\n //\n listTimeTypes(): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.time.timeTypes()) as Promise<readonly unknown[]>;\n }\n getMyTimeEntries(_startDate: string, _endDate: string): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.time.timeId({ params: { path: { id: 0 } } })) as Promise<readonly unknown[]>;\n }\n\n //\n // Reference Data\n //\n listAccounts(_appId?: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.referenceData.accounts()) as Promise<readonly unknown[]>;\n }\n getAccount(accountId: number): Promise<unknown> {\n return this.sdk().then(s => s.referenceData.accountsId({ params: { path: { id: accountId } } }));\n }\n listLocations(): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.referenceData.locations()) as Promise<readonly unknown[]>;\n }\n listFunctionalRoles(): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.referenceData.securityrolesPermissions()) as Promise<readonly unknown[]>;\n }\n listCustomAttributes(_componentId: number, _appId?: number, _associatedTypeId?: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.referenceData.attributesCustom()) as Promise<readonly unknown[]>;\n }\n listTicketStatuses(appId: number): Promise<readonly unknown[]> {\n return this.sdk().then(s => s.referenceData.appIdTicketsStatuses({ params: { path: { appId } } })) as Promise<\n readonly unknown[]\n >;\n }\n\n //\n // Mutations\n //\n createTicket(\n appId: number,\n body: Record<string, unknown>,\n _notifyRequestor?: boolean,\n _notifyResponsible?: boolean,\n ): Promise<unknown> {\n return this.sdk().then(s => s.tickets.createTicket({ appId, body }));\n }\n updateTicket(\n appId: number,\n ticketId: number,\n body: Record<string, unknown>,\n _notifyRequestor?: boolean,\n _notifyResponsible?: boolean,\n _comments?: string,\n _isPrivate?: boolean,\n ): Promise<unknown> {\n return this.sdk().then(s => s.tickets.updateTicket({ appId, ticketId, body }));\n }\n addTicketComment(\n appId: number,\n ticketId: number,\n body: string,\n _isPrivate?: boolean,\n _notifyRequestor?: boolean,\n _notifyResponsible?: boolean,\n ): Promise<unknown> {\n return this.sdk().then(s => s.tickets.addTicketComment({ appId, ticketId, body: { Body: body } }));\n }\n createKbArticle(appId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.sdk().then(s => s.knowledgeBase.createArticle({ appId, body }));\n }\n updateKbArticle(appId: number, articleId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.sdk().then(s => s.knowledgeBase.updateArticle({ appId, articleId, body }));\n }\n createProjectIssue(_projectId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.sdk().then(s => s.projects.createIssue({ body }));\n }\n createProjectRisk(_projectId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.sdk().then(s => s.projects.createRisk({ body }));\n }\n\n //\n // Delete mutations (confirm:true required for all)\n //\n deleteAsset(appId: number, assetId: number): Promise<unknown> {\n return this.sdk().then(s => s.assets.deleteAsset({ appId, assetId, confirm: true }));\n }\n deleteConfigurationItem(appId: number, ciId: number): Promise<unknown> {\n return this.sdk().then(s => s.cmdb.deleteConfigurationItem({ appId, configurationItemId: ciId, confirm: true }));\n }\n deleteService(appId: number, serviceId: number): Promise<unknown> {\n return this.sdk().then(s => s.services.deleteService({ appId, serviceId, confirm: true }));\n }\n deleteServiceCategory(appId: number, categoryId: number): Promise<unknown> {\n return this.sdk().then(s => s.services.deleteServiceCategory({ appId, categoryId, confirm: true }));\n }\n deleteTimeEntry(timeEntryId: number): Promise<unknown> {\n return this.sdk().then(s => s.time.deleteTimeEntry({ timeEntryId, confirm: true }));\n }\n}\n\n/** Creates a configured SDK-backed TeamDynamix client. */\nexport function createConfiguredTeamDynamixClient(): UnifiedTeamDynamixClient {\n return new UnifiedTeamDynamixClient(getTeamDynamixConfig());\n}\n\nexport function assertWriteToolsEnabled(config: TeamDynamixConfig): void {\n if (!config.enableWriteTools) {\n throw new Error('Write tools are disabled. Set TEAMDYNAMIX_ENABLE_WRITE_TOOLS=true in your environment.');\n }\n}\n\nexport function assertDeleteToolsEnabled(config: TeamDynamixConfig): void {\n if (!config.enableDeleteTools) {\n throw new Error('Delete tools are disabled. Set TEAMDYNAMIX_ENABLE_DELETE_TOOLS=true in your environment.');\n }\n}\n","import { tablemark } from 'tablemark';\nimport { CHARACTER_LIMIT } from '../../constants.js';\nimport type { ResponseFormat } from '../../types.js';\n\n/**\n * Render payload to a string based on the requested format.\n * - 'json' returns pretty-printed JSON.\n * - 'markdown' returns human-readable markdown with tables for tabular data and metadata context.\n */\n\nexport function render(\n payload: unknown,\n responseFormat: ResponseFormat,\n characterLimit: number = CHARACTER_LIMIT,\n): string {\n if (responseFormat === 'json') {\n if (typeof payload === 'undefined') return 'undefined';\n return JSON.stringify(payload, null, 2);\n }\n\n // markdown path\n const markdown = renderMarkdown(payload);\n return truncateMarkdown(markdown, characterLimit);\n}\n\nfunction renderMarkdown(payload: unknown): string {\n if (payload == null) return '';\n if (typeof payload !== 'object') {\n // payload == null is already handled above; all remaining non-objects stringify directly\n return String(payload);\n }\n\n if (Array.isArray(payload)) {\n if (payload.length === 0) {\n return '';\n }\n // If array of objects, attempt to render as a table\n if (payload.every(isPlainObject)) {\n return renderArrayAsMarkdownTable(payload);\n }\n // Otherwise fall back to JSON block\n return '```json\\n' + JSON.stringify(payload, null, 2) + '\\n```';\n }\n\n // Single object: render as a compact key/value list unless it contains a table-eligible array\n if (isPlainObject(payload)) {\n const hasArrayOfObjects = Object.values(payload).some(isArrayOfPlainObjects);\n if (hasArrayOfObjects) {\n // Render the array(s) as tables and the rest as context\n return renderObjectWithTables(payload);\n }\n // Compact key/value list for single object\n return renderObjectAsMarkdownList(payload);\n }\n\n return '';\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isArrayOfPlainObjects(value: unknown): value is readonly Record<string, unknown>[] {\n return Array.isArray(value) && value.length > 0 && value.every(isPlainObject);\n}\n\n/**\n * Serialize any value to a compact, human-readable string.\n * Avoids '[object Object]' for nested structures.\n */\nfunction serializeValue(value: unknown): string {\n if (typeof value !== 'object' || value === null) return String(value);\n if (Array.isArray(value)) return value.map(serializeValue).join(', ');\n return (\n '{ ' +\n Object.entries(value)\n .map(([k, v]) => `${k}: ${typeof v === 'object' && v !== null ? '[Object]' : String(v)}`)\n .join(', ') +\n ' }'\n );\n}\n\nfunction renderObjectAsMarkdownList(obj: Record<string, unknown>): string {\n const lines: string[] = [];\n for (const [key, val] of Object.entries(obj)) {\n lines.push(`- **${key}**: ${truncateCell(serializeValue(val))}`);\n }\n return lines.join('\\n');\n}\n\nfunction renderObjectWithTables(obj: Record<string, unknown>): string {\n const lines: string[] = [];\n // First, emit scalar metadata as a bullet list\n const scalarEntries: [string, unknown][] = [];\n const arrayEntries: [string, readonly Record<string, unknown>[]][] = [];\n\n for (const [key, val] of Object.entries(obj)) {\n if (isArrayOfPlainObjects(val)) {\n arrayEntries.push([key, val]);\n } else {\n scalarEntries.push([key, val]);\n }\n }\n\n if (scalarEntries.length > 0) {\n lines.push('**Metadata:**');\n for (const [key, val] of scalarEntries) {\n lines.push(`- **${key}**: ${truncateCell(serializeValue(val))}`);\n }\n lines.push('');\n }\n\n // Then render each array as a markdown table\n for (const [key, arr] of arrayEntries) {\n lines.push(`**${key}:**`);\n const table = renderArrayAsMarkdownTable(arr);\n lines.push(table);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction renderArrayAsMarkdownTable(arr: readonly Record<string, unknown>[]): string {\n // tablemark expects iterable of objects; we'll provide a toCellText to handle nested values safely\n const toCellText = ({ value }: { key: string; value: unknown }): string => serializeValue(value);\n\n // Use headerFormatter to preserve original key casing\n // Generate table, then collapse multiple spaces between pipes to a single space\n let table = tablemark(arr, {\n toCellText,\n headerCase: 'preserve',\n });\n // Replace multiple spaces between pipes with a single space (for all header/row lines)\n table = table.replace(/\\| +/g, '| ').replace(/ +\\|/g, ' |');\n // Fix header separator row: force dashes to exactly 3, 4, 5, ... for columns 1, 2, 3, ...\n table = table.replace(\n /^(\\| +:)(-+)( +\\|)/gm,\n (_match: string, _pre: string, _dashes: string, _post: string, offset: number, str: string) => {\n // Only process the first header separator row\n if (str.slice(0, offset).includes(':---')) return _match;\n // Count columns by splitting the header row above\n const headerLine = str\n .slice(0, offset)\n .split('\\n')\n .reverse()\n .find((l: string) => l.startsWith('|'));\n if (!headerLine) return _match;\n const colCount = headerLine.split('|').length - 2;\n // Build the expected dash counts: 3, 4, 5, ...\n const dashCounts = Array.from({ length: colCount }, (_, i) => 3 + i);\n // Build the new separator row\n const newRow = ['']\n .concat(dashCounts.map(n => ` :${'-'.repeat(n)} `))\n .concat([''])\n .join('|');\n return newRow;\n },\n );\n return table;\n}\n\nfunction truncateCell(str: string): string {\n const MAX = 120;\n if (str.length <= MAX) return str;\n return str.slice(0, MAX) + '…';\n}\n\nfunction truncateMarkdown(markdown: string, limit: number): string {\n if (markdown.length <= limit) return markdown;\n const ellipsis = '...';\n // If limit is too small to fit even the ellipsis, return a clamped slice.\n if (limit <= ellipsis.length) return markdown.slice(0, limit);\n // Slice to fit, then strip trailing newlines before appending ellipsis.\n const truncated = markdown.slice(0, limit - ellipsis.length).replace(/\\n+$/, '');\n return truncated + ellipsis;\n}\n"],"mappings":"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","names":["McpServer","z","z","z","z","require","z","server","server","McpServer"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@selfagency/teamdynamix-mcp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"mcpName": "io.github.selfagency/teamdynamix-mcp",
|
|
5
5
|
"description": "A production-ready TypeScript MCP server for TeamDynamix",
|
|
6
6
|
"keywords": [
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
46
|
-
"@selfagency/teamdynamix-ts": "^0.1.
|
|
46
|
+
"@selfagency/teamdynamix-ts": "^0.1.4",
|
|
47
47
|
"tablemark": "^4.1.0",
|
|
48
48
|
"zod": "^4.4.3"
|
|
49
49
|
}
|
|
50
|
-
}
|
|
50
|
+
}
|