@itm-platform/mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/README.md +193 -0
  2. package/bin/mcp-server.js +2 -0
  3. package/dist/audit-config.d.ts +2 -0
  4. package/dist/audit-config.d.ts.map +1 -0
  5. package/dist/audit-config.js +4 -0
  6. package/dist/audit-config.js.map +1 -0
  7. package/dist/auth/api-key-auth.d.ts +3 -0
  8. package/dist/auth/api-key-auth.d.ts.map +1 -0
  9. package/dist/auth/api-key-auth.js +53 -0
  10. package/dist/auth/api-key-auth.js.map +1 -0
  11. package/dist/auth/effective-user-context.d.ts +16 -0
  12. package/dist/auth/effective-user-context.d.ts.map +1 -0
  13. package/dist/auth/effective-user-context.js +9 -0
  14. package/dist/auth/effective-user-context.js.map +1 -0
  15. package/dist/auth/license-resolver.d.ts +6 -0
  16. package/dist/auth/license-resolver.d.ts.map +1 -0
  17. package/dist/auth/license-resolver.js +12 -0
  18. package/dist/auth/license-resolver.js.map +1 -0
  19. package/dist/auth/oauth-auth.d.ts +22 -0
  20. package/dist/auth/oauth-auth.d.ts.map +1 -0
  21. package/dist/auth/oauth-auth.js +34 -0
  22. package/dist/auth/oauth-auth.js.map +1 -0
  23. package/dist/auth/oauth-metadata.d.ts +11 -0
  24. package/dist/auth/oauth-metadata.d.ts.map +1 -0
  25. package/dist/auth/oauth-metadata.js +14 -0
  26. package/dist/auth/oauth-metadata.js.map +1 -0
  27. package/dist/auth/token-extraction.d.ts +2 -0
  28. package/dist/auth/token-extraction.d.ts.map +1 -0
  29. package/dist/auth/token-extraction.js +7 -0
  30. package/dist/auth/token-extraction.js.map +1 -0
  31. package/dist/clients/audit-client.d.ts +25 -0
  32. package/dist/clients/audit-client.d.ts.map +1 -0
  33. package/dist/clients/audit-client.js +37 -0
  34. package/dist/clients/audit-client.js.map +1 -0
  35. package/dist/clients/datamart-client.d.ts +16 -0
  36. package/dist/clients/datamart-client.d.ts.map +1 -0
  37. package/dist/clients/datamart-client.js +32 -0
  38. package/dist/clients/datamart-client.js.map +1 -0
  39. package/dist/clients/index.d.ts +18 -0
  40. package/dist/clients/index.d.ts.map +1 -0
  41. package/dist/clients/index.js +11 -0
  42. package/dist/clients/index.js.map +1 -0
  43. package/dist/clients/rest-client.d.ts +14 -0
  44. package/dist/clients/rest-client.d.ts.map +1 -0
  45. package/dist/clients/rest-client.js +29 -0
  46. package/dist/clients/rest-client.js.map +1 -0
  47. package/dist/gateway.d.ts +2 -0
  48. package/dist/gateway.d.ts.map +1 -0
  49. package/dist/gateway.js +6 -0
  50. package/dist/gateway.js.map +1 -0
  51. package/dist/instrument-server.d.ts +11 -0
  52. package/dist/instrument-server.d.ts.map +1 -0
  53. package/dist/instrument-server.js +51 -0
  54. package/dist/instrument-server.js.map +1 -0
  55. package/dist/logger.d.ts +4 -0
  56. package/dist/logger.d.ts.map +1 -0
  57. package/dist/logger.js +39 -0
  58. package/dist/logger.js.map +1 -0
  59. package/dist/prompts/portfolio-overview.d.ts +3 -0
  60. package/dist/prompts/portfolio-overview.d.ts.map +1 -0
  61. package/dist/prompts/portfolio-overview.js +21 -0
  62. package/dist/prompts/portfolio-overview.js.map +1 -0
  63. package/dist/prompts/project-status.d.ts +3 -0
  64. package/dist/prompts/project-status.d.ts.map +1 -0
  65. package/dist/prompts/project-status.js +24 -0
  66. package/dist/prompts/project-status.js.map +1 -0
  67. package/dist/prompts/risk-analysis.d.ts +3 -0
  68. package/dist/prompts/risk-analysis.d.ts.map +1 -0
  69. package/dist/prompts/risk-analysis.js +23 -0
  70. package/dist/prompts/risk-analysis.js.map +1 -0
  71. package/dist/prompts/team-workload.d.ts +3 -0
  72. package/dist/prompts/team-workload.d.ts.map +1 -0
  73. package/dist/prompts/team-workload.js +29 -0
  74. package/dist/prompts/team-workload.js.map +1 -0
  75. package/dist/resources/calendars.d.ts +4 -0
  76. package/dist/resources/calendars.d.ts.map +1 -0
  77. package/dist/resources/calendars.js +18 -0
  78. package/dist/resources/calendars.js.map +1 -0
  79. package/dist/resources/schemas.d.ts +4 -0
  80. package/dist/resources/schemas.d.ts.map +1 -0
  81. package/dist/resources/schemas.js +34 -0
  82. package/dist/resources/schemas.js.map +1 -0
  83. package/dist/server.d.ts +2 -0
  84. package/dist/server.d.ts.map +1 -0
  85. package/dist/server.js +243 -0
  86. package/dist/server.js.map +1 -0
  87. package/dist/src/auth/api-key-auth.d.ts +3 -0
  88. package/dist/src/auth/api-key-auth.d.ts.map +1 -0
  89. package/dist/src/auth/api-key-auth.js +53 -0
  90. package/dist/src/auth/api-key-auth.js.map +1 -0
  91. package/dist/src/auth/effective-user-context.d.ts +16 -0
  92. package/dist/src/auth/effective-user-context.d.ts.map +1 -0
  93. package/dist/src/auth/effective-user-context.js +9 -0
  94. package/dist/src/auth/effective-user-context.js.map +1 -0
  95. package/dist/src/auth/license-resolver.d.ts +6 -0
  96. package/dist/src/auth/license-resolver.d.ts.map +1 -0
  97. package/dist/src/auth/license-resolver.js +12 -0
  98. package/dist/src/auth/license-resolver.js.map +1 -0
  99. package/dist/src/auth/oauth-auth.d.ts +22 -0
  100. package/dist/src/auth/oauth-auth.d.ts.map +1 -0
  101. package/dist/src/auth/oauth-auth.js +34 -0
  102. package/dist/src/auth/oauth-auth.js.map +1 -0
  103. package/dist/src/auth/oauth-metadata.d.ts +10 -0
  104. package/dist/src/auth/oauth-metadata.d.ts.map +1 -0
  105. package/dist/src/auth/oauth-metadata.js +8 -0
  106. package/dist/src/auth/oauth-metadata.js.map +1 -0
  107. package/dist/src/auth/token-extraction.d.ts +2 -0
  108. package/dist/src/auth/token-extraction.d.ts.map +1 -0
  109. package/dist/src/auth/token-extraction.js +7 -0
  110. package/dist/src/auth/token-extraction.js.map +1 -0
  111. package/dist/src/clients/audit-client.d.ts +25 -0
  112. package/dist/src/clients/audit-client.d.ts.map +1 -0
  113. package/dist/src/clients/audit-client.js +37 -0
  114. package/dist/src/clients/audit-client.js.map +1 -0
  115. package/dist/src/clients/datamart-client.d.ts +16 -0
  116. package/dist/src/clients/datamart-client.d.ts.map +1 -0
  117. package/dist/src/clients/datamart-client.js +32 -0
  118. package/dist/src/clients/datamart-client.js.map +1 -0
  119. package/dist/src/clients/index.d.ts +18 -0
  120. package/dist/src/clients/index.d.ts.map +1 -0
  121. package/dist/src/clients/index.js +11 -0
  122. package/dist/src/clients/index.js.map +1 -0
  123. package/dist/src/clients/rest-client.d.ts +14 -0
  124. package/dist/src/clients/rest-client.d.ts.map +1 -0
  125. package/dist/src/clients/rest-client.js +29 -0
  126. package/dist/src/clients/rest-client.js.map +1 -0
  127. package/dist/src/logger.d.ts +3 -0
  128. package/dist/src/logger.d.ts.map +1 -0
  129. package/dist/src/logger.js +37 -0
  130. package/dist/src/logger.js.map +1 -0
  131. package/dist/src/prompts/portfolio-overview.d.ts +3 -0
  132. package/dist/src/prompts/portfolio-overview.d.ts.map +1 -0
  133. package/dist/src/prompts/portfolio-overview.js +21 -0
  134. package/dist/src/prompts/portfolio-overview.js.map +1 -0
  135. package/dist/src/prompts/project-status.d.ts +3 -0
  136. package/dist/src/prompts/project-status.d.ts.map +1 -0
  137. package/dist/src/prompts/project-status.js +24 -0
  138. package/dist/src/prompts/project-status.js.map +1 -0
  139. package/dist/src/prompts/risk-analysis.d.ts +3 -0
  140. package/dist/src/prompts/risk-analysis.d.ts.map +1 -0
  141. package/dist/src/prompts/risk-analysis.js +23 -0
  142. package/dist/src/prompts/risk-analysis.js.map +1 -0
  143. package/dist/src/prompts/team-workload.d.ts +3 -0
  144. package/dist/src/prompts/team-workload.d.ts.map +1 -0
  145. package/dist/src/prompts/team-workload.js +29 -0
  146. package/dist/src/prompts/team-workload.js.map +1 -0
  147. package/dist/src/resources/calendars.d.ts +4 -0
  148. package/dist/src/resources/calendars.d.ts.map +1 -0
  149. package/dist/src/resources/calendars.js +18 -0
  150. package/dist/src/resources/calendars.js.map +1 -0
  151. package/dist/src/resources/schemas.d.ts +4 -0
  152. package/dist/src/resources/schemas.d.ts.map +1 -0
  153. package/dist/src/resources/schemas.js +34 -0
  154. package/dist/src/resources/schemas.js.map +1 -0
  155. package/dist/src/server.d.ts +2 -0
  156. package/dist/src/server.d.ts.map +1 -0
  157. package/dist/src/server.js +213 -0
  158. package/dist/src/server.js.map +1 -0
  159. package/dist/src/tools/datamart.d.ts +17 -0
  160. package/dist/src/tools/datamart.d.ts.map +1 -0
  161. package/dist/src/tools/datamart.js +68 -0
  162. package/dist/src/tools/datamart.js.map +1 -0
  163. package/dist/src/tools/financials.d.ts +4 -0
  164. package/dist/src/tools/financials.d.ts.map +1 -0
  165. package/dist/src/tools/financials.js +50 -0
  166. package/dist/src/tools/financials.js.map +1 -0
  167. package/dist/src/tools/graphql-queries.d.ts +22 -0
  168. package/dist/src/tools/graphql-queries.d.ts.map +1 -0
  169. package/dist/src/tools/graphql-queries.js +26 -0
  170. package/dist/src/tools/graphql-queries.js.map +1 -0
  171. package/dist/src/tools/portfolio.d.ts +10 -0
  172. package/dist/src/tools/portfolio.d.ts.map +1 -0
  173. package/dist/src/tools/portfolio.js +54 -0
  174. package/dist/src/tools/portfolio.js.map +1 -0
  175. package/dist/src/tools/projects.d.ts +42 -0
  176. package/dist/src/tools/projects.d.ts.map +1 -0
  177. package/dist/src/tools/projects.js +73 -0
  178. package/dist/src/tools/projects.js.map +1 -0
  179. package/dist/src/tools/reference-data.d.ts +4 -0
  180. package/dist/src/tools/reference-data.d.ts.map +1 -0
  181. package/dist/src/tools/reference-data.js +19 -0
  182. package/dist/src/tools/reference-data.js.map +1 -0
  183. package/dist/src/tools/risks-issues.d.ts +4 -0
  184. package/dist/src/tools/risks-issues.d.ts.map +1 -0
  185. package/dist/src/tools/risks-issues.js +33 -0
  186. package/dist/src/tools/risks-issues.js.map +1 -0
  187. package/dist/src/tools/services.d.ts +41 -0
  188. package/dist/src/tools/services.d.ts.map +1 -0
  189. package/dist/src/tools/services.js +67 -0
  190. package/dist/src/tools/services.js.map +1 -0
  191. package/dist/src/tools/tasks.d.ts +4 -0
  192. package/dist/src/tools/tasks.d.ts.map +1 -0
  193. package/dist/src/tools/tasks.js +17 -0
  194. package/dist/src/tools/tasks.js.map +1 -0
  195. package/dist/src/tools/users.d.ts +4 -0
  196. package/dist/src/tools/users.d.ts.map +1 -0
  197. package/dist/src/tools/users.js +30 -0
  198. package/dist/src/tools/users.js.map +1 -0
  199. package/dist/src/tools/write-tools.d.ts +75 -0
  200. package/dist/src/tools/write-tools.d.ts.map +1 -0
  201. package/dist/src/tools/write-tools.js +193 -0
  202. package/dist/src/tools/write-tools.js.map +1 -0
  203. package/dist/src/validation/query-validator.d.ts +15 -0
  204. package/dist/src/validation/query-validator.d.ts.map +1 -0
  205. package/dist/src/validation/query-validator.js +141 -0
  206. package/dist/src/validation/query-validator.js.map +1 -0
  207. package/dist/startup-mode.d.ts +13 -0
  208. package/dist/startup-mode.d.ts.map +1 -0
  209. package/dist/startup-mode.js +17 -0
  210. package/dist/startup-mode.js.map +1 -0
  211. package/dist/tools/datamart.d.ts +17 -0
  212. package/dist/tools/datamart.d.ts.map +1 -0
  213. package/dist/tools/datamart.js +68 -0
  214. package/dist/tools/datamart.js.map +1 -0
  215. package/dist/tools/financials.d.ts +4 -0
  216. package/dist/tools/financials.d.ts.map +1 -0
  217. package/dist/tools/financials.js +50 -0
  218. package/dist/tools/financials.js.map +1 -0
  219. package/dist/tools/graphql-queries.d.ts +22 -0
  220. package/dist/tools/graphql-queries.d.ts.map +1 -0
  221. package/dist/tools/graphql-queries.js +26 -0
  222. package/dist/tools/graphql-queries.js.map +1 -0
  223. package/dist/tools/portfolio.d.ts +10 -0
  224. package/dist/tools/portfolio.d.ts.map +1 -0
  225. package/dist/tools/portfolio.js +54 -0
  226. package/dist/tools/portfolio.js.map +1 -0
  227. package/dist/tools/projects.d.ts +42 -0
  228. package/dist/tools/projects.d.ts.map +1 -0
  229. package/dist/tools/projects.js +73 -0
  230. package/dist/tools/projects.js.map +1 -0
  231. package/dist/tools/reference-data.d.ts +4 -0
  232. package/dist/tools/reference-data.d.ts.map +1 -0
  233. package/dist/tools/reference-data.js +20 -0
  234. package/dist/tools/reference-data.js.map +1 -0
  235. package/dist/tools/risks-issues.d.ts +4 -0
  236. package/dist/tools/risks-issues.d.ts.map +1 -0
  237. package/dist/tools/risks-issues.js +33 -0
  238. package/dist/tools/risks-issues.js.map +1 -0
  239. package/dist/tools/services.d.ts +41 -0
  240. package/dist/tools/services.d.ts.map +1 -0
  241. package/dist/tools/services.js +67 -0
  242. package/dist/tools/services.js.map +1 -0
  243. package/dist/tools/tasks.d.ts +4 -0
  244. package/dist/tools/tasks.d.ts.map +1 -0
  245. package/dist/tools/tasks.js +17 -0
  246. package/dist/tools/tasks.js.map +1 -0
  247. package/dist/tools/users.d.ts +4 -0
  248. package/dist/tools/users.d.ts.map +1 -0
  249. package/dist/tools/users.js +30 -0
  250. package/dist/tools/users.js.map +1 -0
  251. package/dist/tools/write-tools.d.ts +74 -0
  252. package/dist/tools/write-tools.d.ts.map +1 -0
  253. package/dist/tools/write-tools.js +342 -0
  254. package/dist/tools/write-tools.js.map +1 -0
  255. package/dist/validation/query-validator.d.ts +15 -0
  256. package/dist/validation/query-validator.d.ts.map +1 -0
  257. package/dist/validation/query-validator.js +141 -0
  258. package/dist/validation/query-validator.js.map +1 -0
  259. package/package.json +45 -0
@@ -0,0 +1,193 @@
1
+ import { z } from 'zod';
2
+ import { hashParameters } from '../clients/audit-client.js';
3
+ import { createLogger } from '../logger.js';
4
+ import { hasScope } from '../auth/effective-user-context.js';
5
+ export const STALE_AFTER_WRITE_NOTICE = 'Note: DataMart reads (search_projects, get_project, list_project_tasks, etc.) ' +
6
+ 'may return stale data for 5-60 seconds after a write due to eventual consistency. ' +
7
+ 'The confirmed state above is from the v2 REST API (source of truth).';
8
+ export function buildInsufficientScopeResponse() {
9
+ return {
10
+ content: [{ type: 'text', text: 'Error: insufficient_scope -- the mcp:write scope is required for write operations' }],
11
+ isError: true,
12
+ };
13
+ }
14
+ export function buildWriteResponse(data) {
15
+ return {
16
+ content: [
17
+ { type: 'text', text: JSON.stringify(data, null, 2) },
18
+ { type: 'text', text: STALE_AFTER_WRITE_NOTICE },
19
+ ],
20
+ };
21
+ }
22
+ export async function auditWrap(clients, toolName, args, userContext, operation) {
23
+ const start = Date.now();
24
+ try {
25
+ const result = await operation();
26
+ try {
27
+ await clients.audit.log({
28
+ timestamp: new Date().toISOString(),
29
+ userId: userContext.userId,
30
+ accountId: userContext.accountId,
31
+ toolName,
32
+ parametersHash: hashParameters(args),
33
+ success: true,
34
+ aiClientId: userContext.aiClientId,
35
+ durationMs: Date.now() - start,
36
+ });
37
+ }
38
+ catch {
39
+ // fire-and-forget: audit failure must not break writes
40
+ }
41
+ return result;
42
+ }
43
+ catch (err) {
44
+ try {
45
+ await clients.audit.log({
46
+ timestamp: new Date().toISOString(),
47
+ userId: userContext.userId,
48
+ accountId: userContext.accountId,
49
+ toolName,
50
+ parametersHash: hashParameters(args),
51
+ success: false,
52
+ error: err instanceof Error ? err.message : String(err),
53
+ aiClientId: userContext.aiClientId,
54
+ durationMs: Date.now() - start,
55
+ });
56
+ }
57
+ catch {
58
+ // fire-and-forget
59
+ }
60
+ throw err;
61
+ }
62
+ }
63
+ export function splitCreateTaskArgs(args) {
64
+ const { projectId, ...body } = args;
65
+ return { path: `projects/${projectId}/tasks`, body };
66
+ }
67
+ export function splitUpdateTaskArgs(args) {
68
+ const { projectId, taskId, ...body } = args;
69
+ return { path: `projects/${projectId}/tasks/${taskId}`, body };
70
+ }
71
+ export function splitCreateRiskArgs(args) {
72
+ const { projectId, ...body } = args;
73
+ return { path: `projects/${projectId}/risks`, body };
74
+ }
75
+ export function splitCreateIssueArgs(args) {
76
+ const { projectId, ...body } = args;
77
+ return { path: `projects/${projectId}/issues`, body };
78
+ }
79
+ export function splitUpdateProjectArgs(args) {
80
+ const { projectId, ...body } = args;
81
+ return { path: `projects/${projectId}`, body };
82
+ }
83
+ export function registerWriteTools(server, clients, userContext, log, effectiveUserContext) {
84
+ const l = log ?? createLogger('write-tools');
85
+ server.registerTool('create_task', {
86
+ description: 'Create a new task in a project. Returns the created task from v2 REST (source of truth). Use get_reference_data with entity "gettaskstatuses", "gettasktypes", or "gettaskpriorities" to discover valid IDs.',
87
+ inputSchema: {
88
+ projectId: z.number().describe('The project ID to create the task in'),
89
+ Name: z.string().describe('Task name (required)'),
90
+ Description: z.string().optional().describe('Task description'),
91
+ StatusId: z.number().optional().describe('Task status ID'),
92
+ TypeId: z.number().optional().describe('Task type ID'),
93
+ PriorityId: z.number().optional().describe('Task priority ID'),
94
+ StartDate: z.string().optional().describe('Start date (ISO 8601)'),
95
+ EndDate: z.string().optional().describe('End date (ISO 8601)'),
96
+ AssignedToUserId: z.number().optional().describe('User ID to assign the task to'),
97
+ },
98
+ }, async (args) => {
99
+ if (effectiveUserContext && !hasScope(effectiveUserContext, 'mcp:write'))
100
+ return buildInsufficientScopeResponse();
101
+ const { path, body } = splitCreateTaskArgs(args);
102
+ l.info({ tool: 'create_task', projectId: args.projectId }, 'Write tool invoked');
103
+ const data = await auditWrap(clients, 'create_task', args, userContext, () => clients.rest.post(path, body));
104
+ l.debug({ tool: 'create_task', projectId: args.projectId }, 'Write tool completed');
105
+ return buildWriteResponse(data);
106
+ });
107
+ server.registerTool('update_task', {
108
+ description: 'Update task fields (status, dates, assignee, progress, etc.) via PATCH. Only send the fields you want to change. Returns the updated task from v2 REST.',
109
+ inputSchema: {
110
+ projectId: z.number().describe('The project ID containing the task'),
111
+ taskId: z.number().describe('The task ID to update'),
112
+ Name: z.string().optional().describe('New task name'),
113
+ Description: z.string().optional().describe('New description'),
114
+ StatusId: z.number().optional().describe('New status ID'),
115
+ TypeId: z.number().optional().describe('New type ID'),
116
+ PriorityId: z.number().optional().describe('New priority ID'),
117
+ StartDate: z.string().optional().describe('New start date (ISO 8601)'),
118
+ EndDate: z.string().optional().describe('New end date (ISO 8601)'),
119
+ PercentComplete: z.number().min(0).max(100).optional().describe('Completion percentage (0-100)'),
120
+ AssignedToUserId: z.number().optional().describe('User ID to reassign to'),
121
+ },
122
+ }, async (args) => {
123
+ if (effectiveUserContext && !hasScope(effectiveUserContext, 'mcp:write'))
124
+ return buildInsufficientScopeResponse();
125
+ const { path, body } = splitUpdateTaskArgs(args);
126
+ l.info({ tool: 'update_task', projectId: args.projectId, taskId: args.taskId }, 'Write tool invoked');
127
+ const data = await auditWrap(clients, 'update_task', args, userContext, () => clients.rest.patch(path, body));
128
+ l.debug({ tool: 'update_task', projectId: args.projectId, taskId: args.taskId }, 'Write tool completed');
129
+ return buildWriteResponse(data);
130
+ });
131
+ server.registerTool('create_risk', {
132
+ description: 'Log a new risk in a project. Returns the created risk from v2 REST. Use get_reference_data with entity "riskstatuses" or "risktypes" to discover valid IDs.',
133
+ inputSchema: {
134
+ projectId: z.number().describe('The project ID to create the risk in'),
135
+ Name: z.string().describe('Risk name (required)'),
136
+ Description: z.string().optional().describe('Risk description'),
137
+ StatusId: z.number().optional().describe('Risk status ID'),
138
+ TypeId: z.number().optional().describe('Risk type ID'),
139
+ Probability: z.number().optional().describe('Probability level'),
140
+ Impact: z.number().optional().describe('Impact level'),
141
+ MitigationPlan: z.string().optional().describe('Mitigation plan description'),
142
+ },
143
+ }, async (args) => {
144
+ if (effectiveUserContext && !hasScope(effectiveUserContext, 'mcp:write'))
145
+ return buildInsufficientScopeResponse();
146
+ const { path, body } = splitCreateRiskArgs(args);
147
+ l.info({ tool: 'create_risk', projectId: args.projectId }, 'Write tool invoked');
148
+ const data = await auditWrap(clients, 'create_risk', args, userContext, () => clients.rest.post(path, body));
149
+ l.debug({ tool: 'create_risk', projectId: args.projectId }, 'Write tool completed');
150
+ return buildWriteResponse(data);
151
+ });
152
+ server.registerTool('create_issue', {
153
+ description: 'Log a new issue in a project. Returns the created issue from v2 REST. Use get_reference_data with entity "issuestatuses" or "issuetypes" to discover valid IDs.',
154
+ inputSchema: {
155
+ projectId: z.number().describe('The project ID to create the issue in'),
156
+ Name: z.string().describe('Issue name (required)'),
157
+ Description: z.string().optional().describe('Issue description'),
158
+ StatusId: z.number().optional().describe('Issue status ID'),
159
+ TypeId: z.number().optional().describe('Issue type ID'),
160
+ Severity: z.number().optional().describe('Severity level'),
161
+ Resolution: z.string().optional().describe('Resolution description'),
162
+ },
163
+ }, async (args) => {
164
+ if (effectiveUserContext && !hasScope(effectiveUserContext, 'mcp:write'))
165
+ return buildInsufficientScopeResponse();
166
+ const { path, body } = splitCreateIssueArgs(args);
167
+ l.info({ tool: 'create_issue', projectId: args.projectId }, 'Write tool invoked');
168
+ const data = await auditWrap(clients, 'create_issue', args, userContext, () => clients.rest.post(path, body));
169
+ l.debug({ tool: 'create_issue', projectId: args.projectId }, 'Write tool completed');
170
+ return buildWriteResponse(data);
171
+ });
172
+ server.registerTool('update_project', {
173
+ description: 'Update project fields (name, status, dates, priority, etc.) via PATCH. Only send the fields you want to change. Returns the updated project from v2 REST.',
174
+ inputSchema: {
175
+ projectId: z.number().describe('The project ID to update'),
176
+ Name: z.string().optional().describe('New project name'),
177
+ Description: z.string().optional().describe('New project description'),
178
+ StatusId: z.number().optional().describe('New project status ID'),
179
+ PriorityId: z.number().optional().describe('New priority ID'),
180
+ StartDate: z.string().optional().describe('New start date (ISO 8601)'),
181
+ EndDate: z.string().optional().describe('New end date (ISO 8601)'),
182
+ },
183
+ }, async (args) => {
184
+ if (effectiveUserContext && !hasScope(effectiveUserContext, 'mcp:write'))
185
+ return buildInsufficientScopeResponse();
186
+ const { path, body } = splitUpdateProjectArgs(args);
187
+ l.info({ tool: 'update_project', projectId: args.projectId }, 'Write tool invoked');
188
+ const data = await auditWrap(clients, 'update_project', args, userContext, () => clients.rest.patch(path, body));
189
+ l.debug({ tool: 'update_project', projectId: args.projectId }, 'Write tool completed');
190
+ return buildWriteResponse(data);
191
+ });
192
+ }
193
+ //# sourceMappingURL=write-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-tools.js","sourceRoot":"","sources":["../../../src/tools/write-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface ValidationResult {
2
+ ok: boolean;
3
+ error?: {
4
+ code: string;
5
+ message: string;
6
+ };
7
+ warning?: string;
8
+ }
9
+ interface DataMartBody {
10
+ query?: string;
11
+ variables?: Record<string, unknown>;
12
+ }
13
+ export declare function validateDataMartQuery(body: DataMartBody | null | undefined): ValidationResult;
14
+ export {};
15
+ //# sourceMappingURL=query-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-validator.d.ts","sourceRoot":"","sources":["../../../src/validation/query-validator.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAiGD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,CA8C7F"}
@@ -0,0 +1,141 @@
1
+ // SYNC: Ported from ITM.PMPilot (inference/datamart/validators.js).
2
+ // If you change the allowed operators or aggregation stages here, update the PMPilot copy too.
3
+ //
4
+ // Differences from PMPilot's copy:
5
+ // - TypeScript types
6
+ // - Adds $not to ALLOWED_WHERE_OPERATORS (allowed by DataMart's validate.ts)
7
+ const ALLOWED_WHERE_OPERATORS = new Set([
8
+ '$eq', '$ne', '$in', '$nin', '$gt', '$gte', '$lt', '$lte',
9
+ '$regex', '$options', '$exists', '$not', '$and', '$or', '$nor',
10
+ ]);
11
+ const ALLOWED_AGG_STAGES = new Set([
12
+ '$match', '$project', '$group', '$sort', '$limit', '$skip',
13
+ '$unwind', '$addFields', '$set', '$unset',
14
+ ]);
15
+ function isAggregateQuery(query) {
16
+ return /\baggregateComponents\s*\(/.test(query);
17
+ }
18
+ function isListQuery(query) {
19
+ return /\bcomponents\s*\(/.test(query) && !isAggregateQuery(query);
20
+ }
21
+ function selectsJsonSubfields(query) {
22
+ return /\bcomponent\s*\{/.test(query)
23
+ || /\bcomponents\s*\{/.test(query)
24
+ || /\baggregateComponents\s*\{/.test(query);
25
+ }
26
+ function pipelineHasFacet(p) {
27
+ return p.some(st => st && typeof st === 'object' && Object.prototype.hasOwnProperty.call(st, '$facet'));
28
+ }
29
+ function validateWhereObject(whereObj, path = '$') {
30
+ if (whereObj == null || typeof whereObj !== 'object')
31
+ return { ok: true };
32
+ for (const [key, value] of Object.entries(whereObj)) {
33
+ if (key.startsWith('$')) {
34
+ if (!ALLOWED_WHERE_OPERATORS.has(key)) {
35
+ return { ok: false, error: { code: 'CLIENT_VALIDATION', message: `Disallowed operator ${key} at ${path}` } };
36
+ }
37
+ if (key === '$and' || key === '$or' || key === '$nor') {
38
+ if (Array.isArray(value)) {
39
+ for (let i = 0; i < value.length; i++) {
40
+ const res = validateWhereObject(value[i], `${path}.${key}[${i}]`);
41
+ if (!res.ok)
42
+ return res;
43
+ }
44
+ }
45
+ continue;
46
+ }
47
+ // $not wraps a single condition object
48
+ if (key === '$not') {
49
+ if (value && typeof value === 'object') {
50
+ const res = validateWhereObject(value, `${path}.${key}`);
51
+ if (!res.ok)
52
+ return res;
53
+ }
54
+ continue;
55
+ }
56
+ }
57
+ if (value && typeof value === 'object') {
58
+ const res = validateWhereObject(value, `${path}.${key}`);
59
+ if (!res.ok)
60
+ return res;
61
+ }
62
+ }
63
+ return { ok: true };
64
+ }
65
+ function validatePipeline(pipeline) {
66
+ if (!Array.isArray(pipeline)) {
67
+ return { ok: false, error: { code: 'CLIENT_VALIDATION', message: 'Aggregation pipeline must be an array' } };
68
+ }
69
+ if (pipeline.length === 0) {
70
+ return { ok: false, error: { code: 'CLIENT_VALIDATION', message: 'Aggregation pipeline must include a final $limit stage' } };
71
+ }
72
+ for (let i = 0; i < pipeline.length; i++) {
73
+ const stage = pipeline[i];
74
+ const keys = stage && typeof stage === 'object' ? Object.keys(stage) : [];
75
+ if (keys.length !== 1) {
76
+ return { ok: false, error: { code: 'CLIENT_VALIDATION', message: `Aggregation stage at index ${i} must have exactly one key` } };
77
+ }
78
+ if (!ALLOWED_AGG_STAGES.has(keys[0])) {
79
+ return { ok: false, error: { code: 'CLIENT_VALIDATION', message: `Forbidden stage ${keys[0]} at index ${i}` } };
80
+ }
81
+ }
82
+ const last = pipeline[pipeline.length - 1];
83
+ const lastKey = last && typeof last === 'object' ? Object.keys(last)[0] : null;
84
+ if (lastKey !== '$limit') {
85
+ return { ok: false, error: { code: 'CLIENT_VALIDATION', message: 'Aggregation must end with a final $limit stage' } };
86
+ }
87
+ const limitVal = last['$limit'];
88
+ if (typeof limitVal !== 'number' || !Number.isFinite(limitVal) || limitVal <= 0) {
89
+ return { ok: false, error: { code: 'CLIENT_VALIDATION', message: 'Final $limit must be a positive number' } };
90
+ }
91
+ if (limitVal > 1000) {
92
+ return { ok: false, error: { code: 'CLIENT_VALIDATION', message: 'Final $limit must be ≤ 1000' } };
93
+ }
94
+ return { ok: true };
95
+ }
96
+ export function validateDataMartQuery(body) {
97
+ if (!body || typeof body !== 'object')
98
+ return { ok: true };
99
+ const query = body.query ?? '';
100
+ const variables = (body.variables ?? {});
101
+ if (selectsJsonSubfields(query)) {
102
+ return { ok: false, error: { code: 'CLIENT_VALIDATION', message: 'Do not select subfields of JSON; project fields via variables (proj / w / p) instead.' } };
103
+ }
104
+ if (isAggregateQuery(query)) {
105
+ const pipeline = variables.p ?? variables.pipeline;
106
+ const res = validatePipeline(pipeline);
107
+ if (!res.ok)
108
+ return res;
109
+ if (pipelineHasFacet(pipeline)) {
110
+ return {
111
+ ok: false,
112
+ error: {
113
+ code: 'CLIENT_VALIDATION',
114
+ message: 'Forbidden stage $facet. For totals use components(where...).total with limit=1, or run separate $count pipelines.',
115
+ },
116
+ };
117
+ }
118
+ return { ok: true };
119
+ }
120
+ if (isListQuery(query)) {
121
+ const limit = variables.limit;
122
+ if (typeof limit === 'number' && limit > 100) {
123
+ return { ok: true, warning: 'High limit requested (>100). Server may clamp to 200.' };
124
+ }
125
+ const whereObj = variables.w ?? variables.where;
126
+ if (whereObj) {
127
+ const res = validateWhereObject(whereObj, '$.w');
128
+ if (!res.ok)
129
+ return res;
130
+ }
131
+ return { ok: true };
132
+ }
133
+ const genericWhere = variables.w ?? variables.where;
134
+ if (genericWhere) {
135
+ const res = validateWhereObject(genericWhere, '$.w');
136
+ if (!res.ok)
137
+ return res;
138
+ }
139
+ return { ok: true };
140
+ }
141
+ //# sourceMappingURL=query-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-validator.js","sourceRoot":"","sources":["../../../src/validation/query-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { OAuthConfig } from './auth/oauth-auth.js';
2
+ export type StartupMode = {
3
+ mode: 'stdio';
4
+ } | {
5
+ mode: 'http-dev';
6
+ port: number;
7
+ } | {
8
+ mode: 'http-oauth';
9
+ port: number;
10
+ oauthConfig: OAuthConfig;
11
+ };
12
+ export declare function resolveStartupMode(env: Record<string, string | undefined>, argv: string[]): StartupMode;
13
+ //# sourceMappingURL=startup-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-mode.d.ts","sourceRoot":"","sources":["../src/startup-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,CAAC;AAEnE,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,IAAI,EAAE,MAAM,EAAE,GACb,WAAW,CAiBb"}
@@ -0,0 +1,17 @@
1
+ export function resolveStartupMode(env, argv) {
2
+ const useHttp = env.PORT || argv.includes('--http');
3
+ if (!useHttp)
4
+ return { mode: 'stdio' };
5
+ const port = parseInt(env.PORT ?? '0', 10);
6
+ const authUrl = env.ITM_AUTH_URL;
7
+ const audience = env.MCP_SERVER_URL;
8
+ if (authUrl && audience) {
9
+ return {
10
+ mode: 'http-oauth',
11
+ port,
12
+ oauthConfig: { tokenExchangeUrl: `${authUrl}/auth/exchange-token`, audience },
13
+ };
14
+ }
15
+ return { mode: 'http-dev', port };
16
+ }
17
+ //# sourceMappingURL=startup-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-mode.js","sourceRoot":"","sources":["../src/startup-mode.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,kBAAkB,CAChC,GAAuC,EACvC,IAAc;IAEd,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC;IACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,CAAC;IAEpC,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;QACxB,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,IAAI;YACJ,WAAW,EAAE,EAAE,gBAAgB,EAAE,GAAG,OAAO,sBAAsB,EAAE,QAAQ,EAAE;SAC9E,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Clients } from '../clients/index.js';
3
+ export declare function buildDataMartQueryBody(args: {
4
+ operation: string;
5
+ id?: number;
6
+ where?: Record<string, unknown>;
7
+ project?: Record<string, unknown>;
8
+ sort?: Record<string, unknown>;
9
+ limit?: number;
10
+ skip?: number;
11
+ pipeline?: Record<string, unknown>[];
12
+ }): {
13
+ query: string;
14
+ variables: Record<string, unknown>;
15
+ };
16
+ export declare function registerDataMartTool(server: McpServer, clients: Clients): void;
17
+ //# sourceMappingURL=datamart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datamart.d.ts","sourceRoot":"","sources":["../../src/tools/datamart.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAUnD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACtC;;;EAkBA;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,QA0CvE"}
@@ -0,0 +1,68 @@
1
+ import { z } from 'zod';
2
+ import { COMPONENTS_QUERY, COMPONENT_QUERY, AGGREGATE_QUERY, MAX_LIST_LIMIT, clampLimit } from './graphql-queries.js';
3
+ import { validateDataMartQuery } from '../validation/query-validator.js';
4
+ const QUERY_MAP = {
5
+ component: COMPONENT_QUERY,
6
+ components: COMPONENTS_QUERY,
7
+ aggregateComponents: AGGREGATE_QUERY,
8
+ };
9
+ export function buildDataMartQueryBody(args) {
10
+ const query = QUERY_MAP[args.operation] ?? COMPONENTS_QUERY;
11
+ const variables = {};
12
+ if (args.operation === 'component') {
13
+ variables.id = args.id;
14
+ variables.proj = args.project;
15
+ }
16
+ else if (args.operation === 'aggregateComponents') {
17
+ variables.p = args.pipeline;
18
+ }
19
+ else {
20
+ if (args.where)
21
+ variables.w = args.where;
22
+ if (args.project)
23
+ variables.proj = args.project;
24
+ if (args.sort)
25
+ variables.sort = args.sort;
26
+ variables.limit = clampLimit(args.limit, MAX_LIST_LIMIT);
27
+ variables.skip = args.skip ?? 0;
28
+ }
29
+ return { query, variables };
30
+ }
31
+ export function registerDataMartTool(server, clients) {
32
+ server.registerTool('query_datamart', {
33
+ description: `Run a custom query against ITM DataMart (MongoDB-backed). For advanced analysis beyond typed tools.
34
+
35
+ Operations:
36
+ - "components": list with filters. Params: where, project, sort, limit (max 200), skip
37
+ - "component": single by ID. Params: id, project
38
+ - "aggregateComponents": aggregation pipeline. Params: pipeline (must end with $limit, max 1000)
39
+
40
+ Allowed filter operators: $eq, $ne, $in, $nin, $gt, $gte, $lt, $lte, $regex, $options, $exists, $not, $and, $or, $nor
41
+ Allowed pipeline stages: $match, $project, $group, $sort, $limit, $skip, $unwind, $addFields, $set, $unset
42
+ Banned: $lookup, $merge, $out, $function, $accumulator, $where, $facet
43
+
44
+ Key fields: id, name, code, componentType, statusLabel, priorityLabel, percentComplete, startDate, endDate, methodology, managers, tasks, risks, issues, purchases, revenues, budgetTopDown, budgetActual.`,
45
+ inputSchema: {
46
+ operation: z.enum(['component', 'components', 'aggregateComponents']).describe('The DataMart operation'),
47
+ id: z.number().optional().describe('Component ID (for "component" operation)'),
48
+ where: z.record(z.unknown()).optional().describe('MongoDB filter (for "components")'),
49
+ project: z.record(z.unknown()).optional().describe('Field projection (1 = include)'),
50
+ sort: z.record(z.unknown()).optional().describe('Sort spec (1 = ascending, -1 = descending)'),
51
+ limit: z.number().optional().describe('Max results (default 50, max 200 for list, 1000 for agg)'),
52
+ skip: z.number().optional().describe('Offset for pagination'),
53
+ pipeline: z.array(z.record(z.unknown())).optional().describe('Aggregation pipeline stages (must end with $limit)'),
54
+ },
55
+ }, async (args) => {
56
+ const body = buildDataMartQueryBody(args);
57
+ const validation = validateDataMartQuery({ query: body.query, variables: body.variables });
58
+ if (!validation.ok) {
59
+ return {
60
+ content: [{ type: 'text', text: `Validation error: ${validation.error?.message}` }],
61
+ isError: true,
62
+ };
63
+ }
64
+ const data = await clients.datamart.query(body);
65
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
66
+ });
67
+ }
68
+ //# sourceMappingURL=datamart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datamart.js","sourceRoot":"","sources":["../../src/tools/datamart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Clients } from '../clients/index.js';
3
+ export declare function registerFinancialTools(server: McpServer, clients: Clients): void;
4
+ //# sourceMappingURL=financials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"financials.d.ts","sourceRoot":"","sources":["../../src/tools/financials.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,QA4DzE"}
@@ -0,0 +1,50 @@
1
+ import { z } from 'zod';
2
+ import { COMPONENT_QUERY } from './graphql-queries.js';
3
+ export function registerFinancialTools(server, clients) {
4
+ server.registerTool('get_project_budget', {
5
+ description: 'Get budget summary for a project. Returns four budget objects: budgetTopDown (planned), budgetBottomUp (estimated), budgetPeriodEndClose (forecast), budgetActual (spent).',
6
+ inputSchema: {
7
+ projectId: z.number().describe('The project ID'),
8
+ },
9
+ }, async (args) => {
10
+ const proj = { budgetTopDown: 1, budgetBottomUp: 1, budgetPeriodEndClose: 1, budgetActual: 1 };
11
+ const data = await clients.datamart.query({ query: COMPONENT_QUERY, variables: { id: args.projectId, proj } });
12
+ const component = data.component;
13
+ const budget = {
14
+ budgetTopDown: component?.budgetTopDown ?? null,
15
+ budgetBottomUp: component?.budgetBottomUp ?? null,
16
+ budgetPeriodEndClose: component?.budgetPeriodEndClose ?? null,
17
+ budgetActual: component?.budgetActual ?? null,
18
+ };
19
+ return { content: [{ type: 'text', text: JSON.stringify(budget, null, 2) }] };
20
+ });
21
+ server.registerTool('get_project_purchases', {
22
+ description: 'Get purchase orders for a project. Returns an array of purchase items with amount, status, dates, and provider.',
23
+ inputSchema: {
24
+ projectId: z.number().describe('The project ID'),
25
+ },
26
+ }, async (args) => {
27
+ const data = await clients.datamart.query({
28
+ query: COMPONENT_QUERY,
29
+ variables: { id: args.projectId, proj: { purchases: 1 } },
30
+ });
31
+ const component = data.component;
32
+ const purchases = component?.purchases ?? [];
33
+ return { content: [{ type: 'text', text: JSON.stringify(purchases, null, 2) }] };
34
+ });
35
+ server.registerTool('get_project_revenues', {
36
+ description: 'Get revenue items for a project. Returns an array of revenue entries with amount, status, and dates.',
37
+ inputSchema: {
38
+ projectId: z.number().describe('The project ID'),
39
+ },
40
+ }, async (args) => {
41
+ const data = await clients.datamart.query({
42
+ query: COMPONENT_QUERY,
43
+ variables: { id: args.projectId, proj: { revenues: 1 } },
44
+ });
45
+ const component = data.component;
46
+ const revenues = component?.revenues ?? [];
47
+ return { content: [{ type: 'text', text: JSON.stringify(revenues, null, 2) }] };
48
+ });
49
+ }
50
+ //# sourceMappingURL=financials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"financials.js","sourceRoot":"","sources":["../../src/tools/financials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export declare const COMPONENTS_QUERY = "query($w: JSON, $proj: JSON, $sort: JSON, $limit: Int, $skip: Int) {\n components(where: $w, project: $proj, sort: $sort, limit: $limit, skip: $skip) {\n items total limit skip\n }\n}";
2
+ export declare const COMPONENT_QUERY = "query($id: ID!, $proj: JSON) {\n component(id: $id, project: $proj)\n}";
3
+ export declare const AGGREGATE_QUERY = "query($p: JSON!) {\n aggregateComponents(pipeline: $p)\n}";
4
+ export declare const DEFAULT_PROJECT_FIELDS: {
5
+ id: number;
6
+ name: number;
7
+ code: number;
8
+ componentType: number;
9
+ statusLabel: number;
10
+ priorityLabel: number;
11
+ percentComplete: number;
12
+ startDate: number;
13
+ endDate: number;
14
+ 'managers.name': number;
15
+ 'managers.userId': number;
16
+ methodology: number;
17
+ customTypeLabel: number;
18
+ };
19
+ export declare const MAX_LIST_LIMIT = 200;
20
+ export declare const MAX_AGG_LIMIT = 1000;
21
+ export declare function clampLimit(limit: number | undefined, max: number): number;
22
+ //# sourceMappingURL=graphql-queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-queries.d.ts","sourceRoot":"","sources":["../../src/tools/graphql-queries.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,iMAI3B,CAAC;AAEH,eAAO,MAAM,eAAe,4EAE1B,CAAC;AAEH,eAAO,MAAM,eAAe,+DAE1B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;CAMlC,CAAC;AAEF,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGzE"}