@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.
- package/LICENSE +21 -0
- package/README.md +21 -7
- package/dist/src/auth/api-key-auth.d.ts +3 -0
- package/dist/src/auth/api-key-auth.d.ts.map +1 -0
- package/dist/src/auth/api-key-auth.js +53 -0
- package/dist/src/auth/api-key-auth.js.map +1 -0
- package/dist/src/auth/effective-user-context.d.ts +16 -0
- package/dist/src/auth/effective-user-context.d.ts.map +1 -0
- package/dist/src/auth/effective-user-context.js +9 -0
- package/dist/src/auth/effective-user-context.js.map +1 -0
- package/dist/src/auth/license-resolver.d.ts +6 -0
- package/dist/src/auth/license-resolver.d.ts.map +1 -0
- package/dist/src/auth/license-resolver.js +12 -0
- package/dist/src/auth/license-resolver.js.map +1 -0
- package/dist/src/auth/oauth-auth.d.ts +22 -0
- package/dist/src/auth/oauth-auth.d.ts.map +1 -0
- package/dist/src/auth/oauth-auth.js +34 -0
- package/dist/src/auth/oauth-auth.js.map +1 -0
- package/dist/src/auth/oauth-metadata.d.ts +10 -0
- package/dist/src/auth/oauth-metadata.d.ts.map +1 -0
- package/dist/src/auth/oauth-metadata.js +8 -0
- package/dist/src/auth/oauth-metadata.js.map +1 -0
- package/dist/src/auth/token-extraction.d.ts +2 -0
- package/dist/src/auth/token-extraction.d.ts.map +1 -0
- package/dist/src/auth/token-extraction.js +7 -0
- package/dist/src/auth/token-extraction.js.map +1 -0
- package/dist/src/clients/audit-client.d.ts +25 -0
- package/dist/src/clients/audit-client.d.ts.map +1 -0
- package/dist/src/clients/audit-client.js +37 -0
- package/dist/src/clients/audit-client.js.map +1 -0
- package/dist/src/clients/datamart-client.d.ts +16 -0
- package/dist/src/clients/datamart-client.d.ts.map +1 -0
- package/dist/src/clients/datamart-client.js +32 -0
- package/dist/src/clients/datamart-client.js.map +1 -0
- package/dist/src/clients/index.d.ts +18 -0
- package/dist/src/clients/index.d.ts.map +1 -0
- package/dist/src/clients/index.js +11 -0
- package/dist/src/clients/index.js.map +1 -0
- package/dist/src/clients/rest-client.d.ts +14 -0
- package/dist/src/clients/rest-client.d.ts.map +1 -0
- package/dist/src/clients/rest-client.js +29 -0
- package/dist/src/clients/rest-client.js.map +1 -0
- package/dist/src/logger.d.ts +3 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +37 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/prompts/portfolio-overview.d.ts +3 -0
- package/dist/src/prompts/portfolio-overview.d.ts.map +1 -0
- package/dist/src/prompts/portfolio-overview.js +21 -0
- package/dist/src/prompts/portfolio-overview.js.map +1 -0
- package/dist/src/prompts/project-status.d.ts +3 -0
- package/dist/src/prompts/project-status.d.ts.map +1 -0
- package/dist/src/prompts/project-status.js +24 -0
- package/dist/src/prompts/project-status.js.map +1 -0
- package/dist/src/prompts/risk-analysis.d.ts +3 -0
- package/dist/src/prompts/risk-analysis.d.ts.map +1 -0
- package/dist/src/prompts/risk-analysis.js +23 -0
- package/dist/src/prompts/risk-analysis.js.map +1 -0
- package/dist/src/prompts/team-workload.d.ts +3 -0
- package/dist/src/prompts/team-workload.d.ts.map +1 -0
- package/dist/src/prompts/team-workload.js +29 -0
- package/dist/src/prompts/team-workload.js.map +1 -0
- package/dist/src/resources/calendars.d.ts +4 -0
- package/dist/src/resources/calendars.d.ts.map +1 -0
- package/dist/src/resources/calendars.js +18 -0
- package/dist/src/resources/calendars.js.map +1 -0
- package/dist/src/resources/schemas.d.ts +4 -0
- package/dist/src/resources/schemas.d.ts.map +1 -0
- package/dist/src/resources/schemas.js +34 -0
- package/dist/src/resources/schemas.js.map +1 -0
- package/dist/src/server.d.ts +2 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +213 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/tools/datamart.d.ts +17 -0
- package/dist/src/tools/datamart.d.ts.map +1 -0
- package/dist/src/tools/datamart.js +68 -0
- package/dist/src/tools/datamart.js.map +1 -0
- package/dist/src/tools/financials.d.ts +4 -0
- package/dist/src/tools/financials.d.ts.map +1 -0
- package/dist/src/tools/financials.js +50 -0
- package/dist/src/tools/financials.js.map +1 -0
- package/dist/src/tools/graphql-queries.d.ts +22 -0
- package/dist/src/tools/graphql-queries.d.ts.map +1 -0
- package/dist/src/tools/graphql-queries.js +26 -0
- package/dist/src/tools/graphql-queries.js.map +1 -0
- package/dist/src/tools/portfolio.d.ts +10 -0
- package/dist/src/tools/portfolio.d.ts.map +1 -0
- package/dist/src/tools/portfolio.js +54 -0
- package/dist/src/tools/portfolio.js.map +1 -0
- package/dist/src/tools/projects.d.ts +42 -0
- package/dist/src/tools/projects.d.ts.map +1 -0
- package/dist/src/tools/projects.js +73 -0
- package/dist/src/tools/projects.js.map +1 -0
- package/dist/src/tools/reference-data.d.ts +4 -0
- package/dist/src/tools/reference-data.d.ts.map +1 -0
- package/dist/src/tools/reference-data.js +19 -0
- package/dist/src/tools/reference-data.js.map +1 -0
- package/dist/src/tools/risks-issues.d.ts +4 -0
- package/dist/src/tools/risks-issues.d.ts.map +1 -0
- package/dist/src/tools/risks-issues.js +33 -0
- package/dist/src/tools/risks-issues.js.map +1 -0
- package/dist/src/tools/services.d.ts +41 -0
- package/dist/src/tools/services.d.ts.map +1 -0
- package/dist/src/tools/services.js +67 -0
- package/dist/src/tools/services.js.map +1 -0
- package/dist/src/tools/tasks.d.ts +4 -0
- package/dist/src/tools/tasks.d.ts.map +1 -0
- package/dist/src/tools/tasks.js +17 -0
- package/dist/src/tools/tasks.js.map +1 -0
- package/dist/src/tools/users.d.ts +4 -0
- package/dist/src/tools/users.d.ts.map +1 -0
- package/dist/src/tools/users.js +30 -0
- package/dist/src/tools/users.js.map +1 -0
- package/dist/src/tools/write-tools.d.ts +75 -0
- package/dist/src/tools/write-tools.d.ts.map +1 -0
- package/dist/src/tools/write-tools.js +193 -0
- package/dist/src/tools/write-tools.js.map +1 -0
- package/dist/src/validation/query-validator.d.ts +15 -0
- package/dist/src/validation/query-validator.d.ts.map +1 -0
- package/dist/src/validation/query-validator.js +141 -0
- package/dist/src/validation/query-validator.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|