@itm-platform/mcp-server 1.0.2 → 1.0.3

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 (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -7
  3. package/dist/src/auth/api-key-auth.d.ts +3 -0
  4. package/dist/src/auth/api-key-auth.d.ts.map +1 -0
  5. package/dist/src/auth/api-key-auth.js +53 -0
  6. package/dist/src/auth/api-key-auth.js.map +1 -0
  7. package/dist/src/auth/effective-user-context.d.ts +16 -0
  8. package/dist/src/auth/effective-user-context.d.ts.map +1 -0
  9. package/dist/src/auth/effective-user-context.js +9 -0
  10. package/dist/src/auth/effective-user-context.js.map +1 -0
  11. package/dist/src/auth/license-resolver.d.ts +6 -0
  12. package/dist/src/auth/license-resolver.d.ts.map +1 -0
  13. package/dist/src/auth/license-resolver.js +12 -0
  14. package/dist/src/auth/license-resolver.js.map +1 -0
  15. package/dist/src/auth/oauth-auth.d.ts +22 -0
  16. package/dist/src/auth/oauth-auth.d.ts.map +1 -0
  17. package/dist/src/auth/oauth-auth.js +34 -0
  18. package/dist/src/auth/oauth-auth.js.map +1 -0
  19. package/dist/src/auth/oauth-metadata.d.ts +10 -0
  20. package/dist/src/auth/oauth-metadata.d.ts.map +1 -0
  21. package/dist/src/auth/oauth-metadata.js +8 -0
  22. package/dist/src/auth/oauth-metadata.js.map +1 -0
  23. package/dist/src/auth/token-extraction.d.ts +2 -0
  24. package/dist/src/auth/token-extraction.d.ts.map +1 -0
  25. package/dist/src/auth/token-extraction.js +7 -0
  26. package/dist/src/auth/token-extraction.js.map +1 -0
  27. package/dist/src/clients/audit-client.d.ts +25 -0
  28. package/dist/src/clients/audit-client.d.ts.map +1 -0
  29. package/dist/src/clients/audit-client.js +37 -0
  30. package/dist/src/clients/audit-client.js.map +1 -0
  31. package/dist/src/clients/datamart-client.d.ts +16 -0
  32. package/dist/src/clients/datamart-client.d.ts.map +1 -0
  33. package/dist/src/clients/datamart-client.js +32 -0
  34. package/dist/src/clients/datamart-client.js.map +1 -0
  35. package/dist/src/clients/index.d.ts +18 -0
  36. package/dist/src/clients/index.d.ts.map +1 -0
  37. package/dist/src/clients/index.js +11 -0
  38. package/dist/src/clients/index.js.map +1 -0
  39. package/dist/src/clients/rest-client.d.ts +14 -0
  40. package/dist/src/clients/rest-client.d.ts.map +1 -0
  41. package/dist/src/clients/rest-client.js +29 -0
  42. package/dist/src/clients/rest-client.js.map +1 -0
  43. package/dist/src/logger.d.ts +3 -0
  44. package/dist/src/logger.d.ts.map +1 -0
  45. package/dist/src/logger.js +37 -0
  46. package/dist/src/logger.js.map +1 -0
  47. package/dist/src/prompts/portfolio-overview.d.ts +3 -0
  48. package/dist/src/prompts/portfolio-overview.d.ts.map +1 -0
  49. package/dist/src/prompts/portfolio-overview.js +21 -0
  50. package/dist/src/prompts/portfolio-overview.js.map +1 -0
  51. package/dist/src/prompts/project-status.d.ts +3 -0
  52. package/dist/src/prompts/project-status.d.ts.map +1 -0
  53. package/dist/src/prompts/project-status.js +24 -0
  54. package/dist/src/prompts/project-status.js.map +1 -0
  55. package/dist/src/prompts/risk-analysis.d.ts +3 -0
  56. package/dist/src/prompts/risk-analysis.d.ts.map +1 -0
  57. package/dist/src/prompts/risk-analysis.js +23 -0
  58. package/dist/src/prompts/risk-analysis.js.map +1 -0
  59. package/dist/src/prompts/team-workload.d.ts +3 -0
  60. package/dist/src/prompts/team-workload.d.ts.map +1 -0
  61. package/dist/src/prompts/team-workload.js +29 -0
  62. package/dist/src/prompts/team-workload.js.map +1 -0
  63. package/dist/src/resources/calendars.d.ts +4 -0
  64. package/dist/src/resources/calendars.d.ts.map +1 -0
  65. package/dist/src/resources/calendars.js +18 -0
  66. package/dist/src/resources/calendars.js.map +1 -0
  67. package/dist/src/resources/schemas.d.ts +4 -0
  68. package/dist/src/resources/schemas.d.ts.map +1 -0
  69. package/dist/src/resources/schemas.js +34 -0
  70. package/dist/src/resources/schemas.js.map +1 -0
  71. package/dist/src/server.d.ts +2 -0
  72. package/dist/src/server.d.ts.map +1 -0
  73. package/dist/src/server.js +213 -0
  74. package/dist/src/server.js.map +1 -0
  75. package/dist/src/tools/datamart.d.ts +17 -0
  76. package/dist/src/tools/datamart.d.ts.map +1 -0
  77. package/dist/src/tools/datamart.js +68 -0
  78. package/dist/src/tools/datamart.js.map +1 -0
  79. package/dist/src/tools/financials.d.ts +4 -0
  80. package/dist/src/tools/financials.d.ts.map +1 -0
  81. package/dist/src/tools/financials.js +50 -0
  82. package/dist/src/tools/financials.js.map +1 -0
  83. package/dist/src/tools/graphql-queries.d.ts +22 -0
  84. package/dist/src/tools/graphql-queries.d.ts.map +1 -0
  85. package/dist/src/tools/graphql-queries.js +26 -0
  86. package/dist/src/tools/graphql-queries.js.map +1 -0
  87. package/dist/src/tools/portfolio.d.ts +10 -0
  88. package/dist/src/tools/portfolio.d.ts.map +1 -0
  89. package/dist/src/tools/portfolio.js +54 -0
  90. package/dist/src/tools/portfolio.js.map +1 -0
  91. package/dist/src/tools/projects.d.ts +42 -0
  92. package/dist/src/tools/projects.d.ts.map +1 -0
  93. package/dist/src/tools/projects.js +73 -0
  94. package/dist/src/tools/projects.js.map +1 -0
  95. package/dist/src/tools/reference-data.d.ts +4 -0
  96. package/dist/src/tools/reference-data.d.ts.map +1 -0
  97. package/dist/src/tools/reference-data.js +19 -0
  98. package/dist/src/tools/reference-data.js.map +1 -0
  99. package/dist/src/tools/risks-issues.d.ts +4 -0
  100. package/dist/src/tools/risks-issues.d.ts.map +1 -0
  101. package/dist/src/tools/risks-issues.js +33 -0
  102. package/dist/src/tools/risks-issues.js.map +1 -0
  103. package/dist/src/tools/services.d.ts +41 -0
  104. package/dist/src/tools/services.d.ts.map +1 -0
  105. package/dist/src/tools/services.js +67 -0
  106. package/dist/src/tools/services.js.map +1 -0
  107. package/dist/src/tools/tasks.d.ts +4 -0
  108. package/dist/src/tools/tasks.d.ts.map +1 -0
  109. package/dist/src/tools/tasks.js +17 -0
  110. package/dist/src/tools/tasks.js.map +1 -0
  111. package/dist/src/tools/users.d.ts +4 -0
  112. package/dist/src/tools/users.d.ts.map +1 -0
  113. package/dist/src/tools/users.js +30 -0
  114. package/dist/src/tools/users.js.map +1 -0
  115. package/dist/src/tools/write-tools.d.ts +75 -0
  116. package/dist/src/tools/write-tools.d.ts.map +1 -0
  117. package/dist/src/tools/write-tools.js +193 -0
  118. package/dist/src/tools/write-tools.js.map +1 -0
  119. package/dist/src/validation/query-validator.d.ts +15 -0
  120. package/dist/src/validation/query-validator.d.ts.map +1 -0
  121. package/dist/src/validation/query-validator.js +141 -0
  122. package/dist/src/validation/query-validator.js.map +1 -0
  123. package/package.json +11 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio-overview.d.ts","sourceRoot":"","sources":["../../../src/prompts/portfolio-overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,SAAS,QAuBhE"}
@@ -0,0 +1,21 @@
1
+ export function registerPortfolioOverviewPrompt(server) {
2
+ server.registerPrompt('portfolio_overview', {
3
+ description: 'Portfolio health overview. Aggregates projects by status and methodology, summarizes budget variance.',
4
+ }, async () => ({
5
+ messages: [{
6
+ role: 'user',
7
+ content: {
8
+ type: 'text',
9
+ text: `Generate a portfolio health overview. Use these tools:
10
+ 1. aggregate_portfolio with groupBy: "statusLabel", metrics: ["count", "avgProgress"] to see project distribution by status
11
+ 2. aggregate_portfolio with groupBy: "methodology", metrics: ["count", "totalBudget", "totalActual"] to see methodology breakdown with financials
12
+ Then summarize:
13
+ - Total projects and status distribution
14
+ - Average progress by status
15
+ - Budget health across the portfolio (planned vs actual)
16
+ - Any concerning patterns (e.g., many projects behind schedule)`,
17
+ },
18
+ }],
19
+ }));
20
+ }
21
+ //# sourceMappingURL=portfolio-overview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio-overview.js","sourceRoot":"","sources":["../../../src/prompts/portfolio-overview.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,+BAA+B,CAAC,MAAiB;IAC/D,MAAM,CAAC,cAAc,CACnB,oBAAoB,EACpB;QACE,WAAW,EAAE,uGAAuG;KACrH,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE,CAAC;gBACT,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;;;;;;;gEAOgD;iBACvD;aACF,CAAC;KACH,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerProjectStatusPrompt(server: McpServer): void;
3
+ //# sourceMappingURL=project-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-status.d.ts","sourceRoot":"","sources":["../../../src/prompts/project-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,QAyB5D"}
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ export function registerProjectStatusPrompt(server) {
3
+ server.registerPrompt('project_status', {
4
+ description: 'Generate a status report for a project. Fetches the project with tasks, risks, issues, and budget in one call.',
5
+ argsSchema: {
6
+ projectId: z.string().describe('The project ID to report on'),
7
+ },
8
+ }, async (args) => ({
9
+ messages: [{
10
+ role: 'user',
11
+ content: {
12
+ type: 'text',
13
+ text: `Generate a comprehensive status report for project ${args.projectId}. Use the get_project tool with include: ["tasks", "risks", "issues", "budget"] to fetch all data in one call. Then summarize:
14
+ 1. Overall status and progress
15
+ 2. Key task status breakdown (not started / in progress / completed)
16
+ 3. Active risks and their mitigation status
17
+ 4. Open issues
18
+ 5. Budget health (planned vs actual)
19
+ 6. Key concerns or blockers`,
20
+ },
21
+ }],
22
+ }));
23
+ }
24
+ //# sourceMappingURL=project-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-status.js","sourceRoot":"","sources":["../../../src/prompts/project-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,cAAc,CACnB,gBAAgB,EAChB;QACE,WAAW,EAAE,gHAAgH;QAC7H,UAAU,EAAE;YACV,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;SAC9D;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACf,QAAQ,EAAE,CAAC;gBACT,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,sDAAsD,IAAI,CAAC,SAAS;;;;;;4BAMxD;iBACnB;aACF,CAAC;KACH,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerRiskAnalysisPrompt(server: McpServer): void;
3
+ //# sourceMappingURL=risk-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-analysis.d.ts","sourceRoot":"","sources":["../../../src/prompts/risk-analysis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QAwB3D"}
@@ -0,0 +1,23 @@
1
+ import { z } from 'zod';
2
+ export function registerRiskAnalysisPrompt(server) {
3
+ server.registerPrompt('risk_analysis', {
4
+ description: 'Risk assessment for a project. Fetches risks, issues, and budget data to analyze risk exposure.',
5
+ argsSchema: {
6
+ projectId: z.string().describe('The project ID to analyze'),
7
+ },
8
+ }, async (args) => ({
9
+ messages: [{
10
+ role: 'user',
11
+ content: {
12
+ type: 'text',
13
+ text: `Perform a risk assessment for project ${args.projectId}. Use the get_project tool with include: ["risks", "issues", "budget"] to fetch all relevant data. Then analyze:
14
+ 1. Active risks: probability, impact, and mitigation status
15
+ 2. Open issues: severity and resolution progress
16
+ 3. Budget risk: variance between planned and actual
17
+ 4. Overall risk exposure rating (low/medium/high/critical)
18
+ 5. Recommended actions for the top risks`,
19
+ },
20
+ }],
21
+ }));
22
+ }
23
+ //# sourceMappingURL=risk-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-analysis.js","sourceRoot":"","sources":["../../../src/prompts/risk-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,cAAc,CACnB,eAAe,EACf;QACE,WAAW,EAAE,iGAAiG;QAC9G,UAAU,EAAE;YACV,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SAC5D;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACf,QAAQ,EAAE,CAAC;gBACT,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yCAAyC,IAAI,CAAC,SAAS;;;;;yCAK9B;iBAChC;aACF,CAAC;KACH,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerTeamWorkloadPrompt(server: McpServer): void;
3
+ //# sourceMappingURL=team-workload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-workload.d.ts","sourceRoot":"","sources":["../../../src/prompts/team-workload.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QA+B3D"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ export function registerTeamWorkloadPrompt(server) {
3
+ server.registerPrompt('team_workload', {
4
+ description: 'Team workload overview. Shows user assignments and project involvement.',
5
+ argsSchema: {
6
+ userId: z.string().optional().describe('Optional: specific user ID to focus on'),
7
+ },
8
+ }, async (args) => {
9
+ const userFilter = args.userId
10
+ ? ` Focus on user ${args.userId} -- use get_user to get their details first.`
11
+ : ' Get a broad view of the team.';
12
+ return {
13
+ messages: [{
14
+ role: 'user',
15
+ content: {
16
+ type: 'text',
17
+ text: `Generate a team workload overview.${userFilter} Use these tools:
18
+ 1. search_users to find team members
19
+ 2. search_projects to see active projects and their managers
20
+ Then summarize:
21
+ - Who is assigned to what
22
+ - Which projects have the most team involvement
23
+ - Any potential overload or underutilization patterns`,
24
+ },
25
+ }],
26
+ };
27
+ });
28
+ }
29
+ //# sourceMappingURL=team-workload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-workload.js","sourceRoot":"","sources":["../../../src/prompts/team-workload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,cAAc,CACnB,eAAe,EACf;QACE,WAAW,EAAE,yEAAyE;QACtF,UAAU,EAAE;YACV,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;SACjF;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM;YAC5B,CAAC,CAAC,kBAAkB,IAAI,CAAC,MAAM,8CAA8C;YAC7E,CAAC,CAAC,gCAAgC,CAAC;QAErC,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,qCAAqC,UAAU;;;;;;sDAMX;qBAC3C;iBACF,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -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 registerCalendarResources(server: McpServer, clients: Clients): void;
4
+ //# sourceMappingURL=calendars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendars.d.ts","sourceRoot":"","sources":["../../../src/resources/calendars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AACtF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,QAoB5E"}
@@ -0,0 +1,18 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export function registerCalendarResources(server, clients) {
3
+ server.registerResource('calendar', new ResourceTemplate('itm://calendars/{projectId}', { list: undefined }), {
4
+ description: 'Holiday calendar and work hours for a project',
5
+ mimeType: 'application/json',
6
+ }, async (_uri, variables) => {
7
+ const projectId = variables.projectId;
8
+ const data = await clients.rest.get(`holidays`);
9
+ return {
10
+ contents: [{
11
+ uri: `itm://calendars/${projectId}`,
12
+ mimeType: 'application/json',
13
+ text: JSON.stringify(data, null, 2),
14
+ }],
15
+ };
16
+ });
17
+ }
18
+ //# sourceMappingURL=calendars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendars.js","sourceRoot":"","sources":["../../../src/resources/calendars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAGtF,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,OAAgB;IAC3E,MAAM,CAAC,gBAAgB,CACrB,UAAU,EACV,IAAI,gBAAgB,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EACxE;QACE,WAAW,EAAE,+CAA+C;QAC5D,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;QACxB,MAAM,SAAS,GAAG,SAAS,CAAC,SAAmB,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,mBAAmB,SAAS,EAAE;oBACnC,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -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 registerSchemaResources(server: McpServer, clients: Clients): void;
4
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/resources/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAoBnD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,QAsB1E"}
@@ -0,0 +1,34 @@
1
+ const SCHEMA_ENTITIES = ['component', 'task', 'purchase', 'risk', 'issue'];
2
+ const SCHEMA_URI_MAP = {
3
+ component: 'itm://schema/component',
4
+ task: 'itm://schema/tasks',
5
+ purchase: 'itm://schema/purchases',
6
+ risk: 'itm://schema/risks',
7
+ issue: 'itm://schema/issues',
8
+ };
9
+ const SCHEMA_DESCRIPTIONS = {
10
+ component: 'DataMart component schema (projects/services) -- available fields, types, and enums',
11
+ task: 'DataMart task schema -- fields available on task subcomponents',
12
+ purchase: 'DataMart purchase schema -- fields available on purchase subcomponents',
13
+ risk: 'DataMart risk schema -- fields available on risk subcomponents',
14
+ issue: 'DataMart issue schema -- fields available on issue subcomponents',
15
+ };
16
+ export function registerSchemaResources(server, clients) {
17
+ for (const entity of SCHEMA_ENTITIES) {
18
+ const uri = SCHEMA_URI_MAP[entity];
19
+ server.registerResource(`schema-${entity}`, uri, {
20
+ description: SCHEMA_DESCRIPTIONS[entity],
21
+ mimeType: 'application/json',
22
+ }, async () => {
23
+ const data = await clients.rest.get(`datamart/api/schema/${entity}`);
24
+ return {
25
+ contents: [{
26
+ uri,
27
+ mimeType: 'application/json',
28
+ text: JSON.stringify(data, null, 2),
29
+ }],
30
+ };
31
+ });
32
+ }
33
+ }
34
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/resources/schemas.ts"],"names":[],"mappings":"AAGA,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAEpF,MAAM,cAAc,GAA2B;IAC7C,SAAS,EAAE,wBAAwB;IACnC,IAAI,EAAE,oBAAoB;IAC1B,QAAQ,EAAE,wBAAwB;IAClC,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,qBAAqB;CAC7B,CAAC;AAEF,MAAM,mBAAmB,GAA2B;IAClD,SAAS,EAAE,qFAAqF;IAChG,IAAI,EAAE,gEAAgE;IACtE,QAAQ,EAAE,wEAAwE;IAClF,IAAI,EAAE,gEAAgE;IACtE,KAAK,EAAE,kEAAkE;CAC1E,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,OAAgB;IACzE,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,gBAAgB,CACrB,UAAU,MAAM,EAAE,EAClB,GAAG,EACH;YACE,WAAW,EAAE,mBAAmB,CAAC,MAAM,CAAC;YACxC,QAAQ,EAAE,kBAAkB;SAC7B,EACD,KAAK,IAAI,EAAE;YACT,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;YACrE,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG;wBACH,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;qBACpC,CAAC;aACH,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":""}
@@ -0,0 +1,213 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
+ import { createServer } from 'node:http';
5
+ import { randomUUID } from 'node:crypto';
6
+ import { createLogger } from './logger.js';
7
+ import { resolveIdentity } from './auth/api-key-auth.js';
8
+ import { createClients } from './clients/index.js';
9
+ import { registerProjectTools } from './tools/projects.js';
10
+ import { registerServiceTools } from './tools/services.js';
11
+ import { registerTaskTools } from './tools/tasks.js';
12
+ import { registerFinancialTools } from './tools/financials.js';
13
+ import { registerRisksIssuesTools } from './tools/risks-issues.js';
14
+ import { registerPortfolioTools } from './tools/portfolio.js';
15
+ import { registerDataMartTool } from './tools/datamart.js';
16
+ import { registerUserTools } from './tools/users.js';
17
+ import { registerReferenceDataTools } from './tools/reference-data.js';
18
+ import { registerWriteTools } from './tools/write-tools.js';
19
+ import { registerSchemaResources } from './resources/schemas.js';
20
+ import { registerCalendarResources } from './resources/calendars.js';
21
+ import { registerProjectStatusPrompt } from './prompts/project-status.js';
22
+ import { registerPortfolioOverviewPrompt } from './prompts/portfolio-overview.js';
23
+ import { registerTeamWorkloadPrompt } from './prompts/team-workload.js';
24
+ import { registerRiskAnalysisPrompt } from './prompts/risk-analysis.js';
25
+ import { buildProtectedResourceMetadata } from './auth/oauth-metadata.js';
26
+ import { extractBearerToken } from './auth/token-extraction.js';
27
+ import { exchangeToken, buildEffectiveUserContextFromExchange } from './auth/oauth-auth.js';
28
+ import { createAuditClient } from './clients/audit-client.js';
29
+ import { hasScope } from './auth/effective-user-context.js';
30
+ const log = createLogger('mcp');
31
+ function createMcpServer(clients, writeCtx, userContext) {
32
+ const server = new McpServer({ name: 'itm-platform', version: '1.0.0' }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
33
+ registerProjectTools(server, clients);
34
+ registerServiceTools(server, clients);
35
+ registerTaskTools(server, clients);
36
+ registerFinancialTools(server, clients);
37
+ registerRisksIssuesTools(server, clients);
38
+ registerPortfolioTools(server, clients);
39
+ registerDataMartTool(server, clients);
40
+ registerUserTools(server, clients);
41
+ registerReferenceDataTools(server, clients);
42
+ if (hasScope(userContext, 'mcp:write')) {
43
+ registerWriteTools(server, clients, writeCtx, undefined, userContext);
44
+ }
45
+ registerSchemaResources(server, clients);
46
+ registerCalendarResources(server, clients);
47
+ registerProjectStatusPrompt(server);
48
+ registerPortfolioOverviewPrompt(server);
49
+ registerTeamWorkloadPrompt(server);
50
+ registerRiskAnalysisPrompt(server);
51
+ return server;
52
+ }
53
+ function buildClientsForUser(userContext) {
54
+ const auditEnabled = process.env.ITM_AUDIT_ENABLED === 'true';
55
+ const audit = auditEnabled
56
+ ? createAuditClient({
57
+ apiUrl: process.env.ITM_API_URL,
58
+ company: userContext.company,
59
+ authHeaders: userContext.authHeaders,
60
+ log,
61
+ })
62
+ : undefined;
63
+ return createClients({
64
+ apiUrl: process.env.ITM_API_URL,
65
+ company: userContext.company,
66
+ authHeaders: userContext.authHeaders,
67
+ log,
68
+ }, audit);
69
+ }
70
+ function getOAuthConfig() {
71
+ const authUrl = process.env.ITM_AUTH_URL;
72
+ const audience = process.env.MCP_SERVER_URL;
73
+ if (!authUrl || !audience)
74
+ return undefined;
75
+ return {
76
+ tokenExchangeUrl: `${authUrl}/auth/exchange-token`,
77
+ audience,
78
+ };
79
+ }
80
+ async function main() {
81
+ log.info('ITM Platform MCP server starting...');
82
+ let userContext;
83
+ try {
84
+ userContext = await resolveIdentity();
85
+ log.info({ userId: userContext.userId, email: userContext.email, access: userContext.dataMartAccess }, 'Identity resolved');
86
+ }
87
+ catch (err) {
88
+ log.fatal({ err }, 'Failed to resolve identity');
89
+ process.exit(1);
90
+ }
91
+ const clients = buildClientsForUser(userContext);
92
+ const oauthConfig = getOAuthConfig();
93
+ const useHttp = process.env.PORT || process.argv.includes('--http');
94
+ if (useHttp) {
95
+ const port = parseInt(process.env.PORT ?? '6160', 10);
96
+ const sessions = new Map();
97
+ if (oauthConfig) {
98
+ log.info('OAuth configured -- per-session auth enabled');
99
+ }
100
+ else {
101
+ log.info('OAuth not configured -- using startup identity for all sessions');
102
+ }
103
+ const httpServer = createServer(async (req, res) => {
104
+ try {
105
+ if (req.method === 'GET' && req.url === '/.well-known/oauth-protected-resource') {
106
+ const metadata = buildProtectedResourceMetadata({
107
+ mcpServerUrl: process.env.MCP_SERVER_URL ?? `http://localhost:${port}`,
108
+ authorizationServerUrl: process.env.ITM_AUTH_URL ?? '',
109
+ });
110
+ res.writeHead(200, { 'Content-Type': 'application/json' });
111
+ res.end(JSON.stringify(metadata));
112
+ return;
113
+ }
114
+ if (req.method === 'POST' && req.url === '/mcp') {
115
+ const body = await new Promise((resolve) => {
116
+ let data = '';
117
+ req.on('data', (chunk) => { data += chunk.toString(); });
118
+ req.on('end', () => resolve(data));
119
+ });
120
+ const parsed = JSON.parse(body);
121
+ const sessionId = req.headers['mcp-session-id'];
122
+ let transport;
123
+ if (sessionId && sessions.has(sessionId)) {
124
+ transport = sessions.get(sessionId).transport;
125
+ }
126
+ else if (!sessionId && parsed.method === 'initialize') {
127
+ let sessionClients = clients;
128
+ let sessionUserContext = userContext;
129
+ const aiClientId = parsed.params?.clientInfo?.name ?? 'unknown';
130
+ if (oauthConfig) {
131
+ const oauthToken = extractBearerToken(req.headers);
132
+ if (oauthToken) {
133
+ try {
134
+ const exchangeResult = await exchangeToken(oauthToken, oauthConfig, log);
135
+ sessionUserContext = buildEffectiveUserContextFromExchange(exchangeResult);
136
+ sessionClients = buildClientsForUser(sessionUserContext);
137
+ log.info({ userId: sessionUserContext.userId, email: sessionUserContext.email }, 'Per-session auth resolved');
138
+ }
139
+ catch (err) {
140
+ log.error({ err }, 'OAuth token exchange failed');
141
+ res.writeHead(401, { 'Content-Type': 'application/json' });
142
+ res.end(JSON.stringify({ error: 'Authentication failed' }));
143
+ return;
144
+ }
145
+ }
146
+ }
147
+ const writeCtx = {
148
+ userId: sessionUserContext.userId,
149
+ accountId: sessionUserContext.accountId,
150
+ aiClientId,
151
+ };
152
+ const server = createMcpServer(sessionClients, writeCtx, sessionUserContext);
153
+ transport = new StreamableHTTPServerTransport({
154
+ sessionIdGenerator: () => randomUUID(),
155
+ enableJsonResponse: true,
156
+ });
157
+ transport.onclose = () => {
158
+ if (transport.sessionId)
159
+ sessions.delete(transport.sessionId);
160
+ };
161
+ await server.connect(transport);
162
+ await transport.handleRequest(req, res, parsed);
163
+ if (transport.sessionId) {
164
+ sessions.set(transport.sessionId, { server, transport });
165
+ log.debug({ sessionId: transport.sessionId, aiClientId }, 'Session created');
166
+ }
167
+ return;
168
+ }
169
+ else {
170
+ res.writeHead(400, { 'Content-Type': 'application/json' });
171
+ res.end(JSON.stringify({ error: 'Missing or invalid session' }));
172
+ return;
173
+ }
174
+ await transport.handleRequest(req, res, parsed);
175
+ }
176
+ else if (req.method === 'GET' && req.url === '/health') {
177
+ res.writeHead(200, { 'Content-Type': 'application/json' });
178
+ res.end(JSON.stringify({ status: 'ok', user: userContext.email }));
179
+ }
180
+ else {
181
+ res.writeHead(404);
182
+ res.end();
183
+ }
184
+ }
185
+ catch (err) {
186
+ log.error({ err }, 'HTTP request error');
187
+ if (!res.headersSent) {
188
+ res.writeHead(500, { 'Content-Type': 'application/json' });
189
+ res.end(JSON.stringify({ error: 'Internal server error' }));
190
+ }
191
+ }
192
+ });
193
+ httpServer.listen(port, () => {
194
+ log.info({ port, transport: 'http' }, `MCP server listening on http://localhost:${port}/mcp`);
195
+ });
196
+ }
197
+ else {
198
+ const writeCtx = {
199
+ userId: userContext.userId,
200
+ accountId: userContext.accountId,
201
+ aiClientId: 'stdio',
202
+ };
203
+ const server = createMcpServer(clients, writeCtx, userContext);
204
+ const transport = new StdioServerTransport();
205
+ await server.connect(transport);
206
+ log.info({ transport: 'stdio' }, 'MCP server connected via stdio');
207
+ }
208
+ }
209
+ main().catch((err) => {
210
+ log.fatal({ err }, 'Unhandled error');
211
+ process.exit(1);
212
+ });
213
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
@@ -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"}